2017-03-29 17 views
7

आवश्यकता है: मैं उन सभी ग्राहकों का संग्रह चाहता हूं जो did not perform the "View" event in last 5 hours हैं।मोंगो डीबी: उन सभी को छोड़कर सभी दस्तावेज खोजें जहां दिनांक सीमा शर्त

डाटा:

{ 
    name: "Sheldon", 
    events: [ 
     { 
      event: "View", 
      timestamp: "timestamp equivalent to 10 hours ago" 
     }, 
     { 
      event: "Some other event", 
      timestamp: "timestamp equivalent to 8 hours ago" 
     }, 
     { 
      event: "View", 
      timestamp: "timestamp equivalent to 2 hours ago" 
     } 
    ] 
}, 
{ 
    name: "Leonard", 
    events: [ 
     { 
      event: "View", 
      timestamp: "timestamp equivalent to 10 hours ago" 
     } 
    ] 
}, 
{ 
    name: "Howard", 
    events: [ 
     { 
      event: "View", 
      timestamp: "timestamp equivalent to 2 hours ago" 
     } 
    ] 
}, 
{ 
    name: "Raj", 
    events: [ 
     { 
      event: "Some other event", 
      timestamp: "timestamp equivalent to 6 hours ago" 
     } 
    ] 
} 

मैं निम्नलिखित बाहर की कोशिश की है, लेकिन यह हमेशा "Sheldon" रिटर्न (शायद क्योंकि अन्य घटना मानदंडों को पूरा समाप्त होता है?)।

q.where({ 
    $and: [ 
     { 
      'events': { 
       $not: { 
        $elemMatch: { 
         event: "View", 
         timestamp: { 
          $gte: "timestamp equivalent to 5 hours ago" 
         } 
        } 
       } 
      } 
     } 
    ] 
}); 

क्या इतना है कि केवल "Leonard" और "Raj" के लिए दस्तावेज लौटा दिए जाते हैं मैं कर सकता है?

+1

चेक [इस सवाल] (http: // stackoverflow ।कॉम/प्रश्न/1 9 465634/mongodb-query-on-nested-array-elements) एक बार। –

+0

अधिक जानकारी के लिए आप (https://docs.mongodb.com/manual/reference/operator/query-comparison/) देख सकते हैं। –

+0

@TanmayBaranwal मेरी मिसाल क्वेरी आपके लिंक में से एक के बराबर है, उम्मीद के अनुसार काम नहीं करती है क्योंकि एक और घटना है जो मानदंडों को पूरा करती है। – hiteshspac

उत्तर

2

उपयोगकर्ताओं को प्राप्त करने के लिए पिछले 5 घंटों में कैसे नहीं देखा गया है। आपकी क्वेरी की तरह है, लेकिन मैं find बजाय where इस्तेमाल किया, $and उपयोग करने की आवश्यकता है और प्रयोग किया है: आप इसे

db.collectionName.find({ 
    events: { 
     $not: { 
      $elemMatch: { 
       event: "View", 
       timestamp: { 
        $gt: ISODate("2017-03-29T05:12:37.420Z") // equivalent to 5 hours ago 
       } 
      } 
     } 
    } 
}, {name: 1}) 

इस क्वेरी returned केवल अपने दिए गए उदाहरण के लिए Leonard और Raj के लिए दस्तावेजों

नायब कोशिश कर सकते हैं $gte

दस्तावेजों के लिए परीक्षण किया गया।

{ 
    "_id" : ObjectId("58db886e4b9e731aaefa9820"), 
    "name" : "Sheldon", 
    "events" : [ 
     { 
      "event" : "View", 
      "timestamp" : ISODate("2017-03-29T00:09:18.723Z") 
     }, 
     { 
      "event" : "Some other event", 
      "timestamp" : ISODate("2017-03-29T02:10:04.492Z") 
     }, 
     { 
      "event" : "View", 
      "timestamp" : ISODate("2017-03-29T08:11:02.196Z") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("58db886e4b9e731aaefa9821"), 
    "name" : "Leonard", 
    "events" : [ 
     { 
      "event" : "View", 
      "timestamp" : ISODate("2017-03-29T00:11:23.084Z") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("58db886e4b9e731aaefa9822"), 
    "name" : "Howard", 
    "events" : [ 
     { 
      "event" : "View", 
      "timestamp" : ISODate("2017-03-29T08:11:02.196Z") 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("58db886e4b9e731aaefa9823"), 
    "name" : "Raj", 
    "events" : [ 
     { 
      "event" : "Some other event", 
      "timestamp" : ISODate("2017-03-29T04:10:42.972Z") 
     } 
    ] 
} 

के बाद मेरी क्वेरी परिणाम लागू: जब मैं, शेल्डन दस्तावेज़ लौटे हो जाता है अपने सटीक डेटा के साथ अपने क्वेरी चलाने

{ 
    "_id" : ObjectId("58db886e4b9e731aaefa9821"), 
    "name" : "Leonard" 
}, 
{ 
    "_id" : ObjectId("58db886e4b9e731aaefa9823"), 
    "name" : "Raj" 
} 
+0

इस प्रश्न में मैंने जो उल्लेख किया है उससे अलग कैसे है? – hiteshspac

+0

आपकी क्वेरी के अलावा '$ gte' के बजाय' $ और' का उपयोग करने की आवश्यकता नहीं है और '$ gt'' का उपयोग किया जाना चाहिए। आपके डेटा का उपयोग करके परीक्षण किया गया :) @hiteshspac –

+0

@Sishishaboy आपके द्वारा लिखी गई क्वेरी आउटपुट को वांछित नहीं देती है। यह पूरे डेटासेट को पीछे हटाना। क्या तुम इसे जांचोगे! –

1

क्योंकि आप स्ट्रिंग "2 घंटे पहले" की तुलना करें स्ट्रिंग "5 घंटे पहले", चरित्र "2" चरित्र से कम है "5" तो दस्तावेज़ सही ढंग से वापस हो जाता है। स्ट्रिंग "10 घंटे पूर्व" को "5 घंटे पहले" से भी कम के रूप में क्रमबद्ध किया गया है।

हालांकि यदि आप नीचे वास्तविक संख्या रखने के लिए डेटा समायोजित करते हैं, तो शेल्डन दस्तावेज़ वापस नहीं किया जाता है।

तो आपकी क्वेरी मेरे लिए अच्छी लगती है, आपको केवल टाइमस्टैम्प को तिथियों, संख्याओं या यहां तक ​​कि स्ट्रिंग्स के साथ प्रतिस्थापित करने की आवश्यकता है ताकि वे सही क्रम में क्रमबद्ध हों।

संशोधित डाटा:

{ 
    name: "Sheldon", 
    events: [ 
     { 
      event: "View", 
      timestamp: -10 
     }, 
     { 
      event: "Some other event", 
      timestamp: -8 
     }, 
     { 
      event: "View", 
      timestamp: -2 
     } 
    ] 
}, 
{ 
    name: "Leonard", 
    events: [ 
     { 
      event: "View", 
      timestamp: -10 
     } 
    ] 
}, 
{ 
    name: "Howard", 
    events: [ 
     { 
      event: "View", 
      timestamp: -2 
     } 
    ] 
}, 
{ 
    name: "Raj", 
    events: [ 
     { 
      event: "Some other event", 
      timestamp: -6 
     } 
    ] 
} 

संशोधित क्वेरी:

{ 
    $and: [ 
     { 
      'events': { 
       $not: { 
        $elemMatch: { 
         event: "View", 
         timestamp: { 
          $gte: -5 
         } 
        } 
       } 
      } 
     } 
    ] 
} 

परिणाम:

{ "name" : "Leonard", "events" : [ { "event" : "View", "timestamp" : -10 } ] } 
{ "name" : "Raj", "events" : [ { "event" : "Some other event", "timestamp" : -6 } ] } 
संबंधित मुद्दे