json Mongodb में ISODate के साथ दिनांक क्वेरी काम नहीं लगती है




bson (6)

मैं MongoDB में काम करने के लिए सबसे बुनियादी तारीख क्वेरी भी प्राप्त करने में सक्षम नहीं प्रतीत होता। एक दस्तावेज़ के साथ ऐसा कुछ दिखता है:

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}

और एक ऐसा प्रश्न जो इस तरह दिखता है:

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}

मुझे निष्पादन से 0 परिणाम मिलते हैं:

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})

कोई विचार क्यों यह काम नहीं करता है?

संदर्भ के लिए, यह प्रश्न स्प्रिंग्स मोंगो टेम्पलेट द्वारा उत्पादित किया जा रहा है, इसलिए मुझे उस क्वेरी पर प्रत्यक्ष नियंत्रण नहीं है जिसे आखिरकार मोंगोडीबी को भेजा गया है।

(पी एस)

> db.version()
2.4.7

धन्यवाद!


हालांकि $date मोंगोडीबी विस्तारित जेएसओएन का एक हिस्सा है और यही वह है जो आपको mongoexport साथ डिफ़ॉल्ट रूप से mongoexport मुझे नहीं लगता कि आप वास्तव में क्वेरी के हिस्से के रूप में इसका उपयोग कर सकते हैं।

यदि नीचे की तरह $date साथ सटीक खोज आज़माएं:

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})

आपको त्रुटि मिलेगी:

error: { "$err" : "invalid operator: $date", "code" : 10068 }

इसे इस्तेमाल करे:

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})

या ( @user3805045 द्वारा टिप्पणियों के बाद):

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})

ISODate को बिना समय के तिथियों की तुलना करने की आवश्यकता हो सकती है ( @MattMolnar द्वारा नोट किया @MattMolnar )।

मोंगो शैल में डेटा प्रकार के अनुसार दोनों बराबर होना चाहिए:

मोंगो खोल तिथि को वापस करने के लिए विभिन्न विधियों को प्रदान करता है, या तो एक स्ट्रिंग या डेट ऑब्जेक्ट के रूप में:

  • दिनांक () विधि जो वर्तमान दिनांक को स्ट्रिंग के रूप में लौटाती है।
  • नई तिथि () कन्स्ट्रक्टर जो ISODate () wrapper का उपयोग कर डेट ऑब्जेक्ट देता है।
  • ISODate () कन्स्ट्रक्टर जो ISODate () wrapper का उपयोग कर डेट ऑब्जेक्ट देता है।

और ISODate का उपयोग करना अभी भी एक दिनांक वस्तु वापस करना चाहिए

{"$date": "ISO-8601 string"} का उपयोग तब किया जा सकता है जब सख्त JSON प्रतिनिधित्व की आवश्यकता होती है। एक संभावित उदाहरण हैडोप कनेक्टर है।


जेसन सख्त मोड में, आपको ऑर्डर रखना होगा:

{
    "dt": {
        "$gte": {
            "$date": "2013-10-01T00:00:00.000Z"
        }
    }
}

केवल एक चीज जो mlab.com पर मेरे खोज प्रश्नों को परिभाषित करने के लिए काम करती है।


मैं robongongo का उपयोग mongodb क्लाइंट gui के रूप में कर रहा हूँ और नीचे मेरे लिए काम किया

db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})

ऐप की तरफ मैं नोडजेस आधारित ड्राइवर मोंगोडब (v1.4.3) का उपयोग कर रहा हूं, एप्लिकेशन यूईई में डेटपिकर का उपयोग करता है जो वाई वाई वाई वाई-डीडी जैसी तारीख देता है, फिर इसे 00:00:00 जैसे डिफ़ॉल्ट समय के साथ जोड़ा जाता है और फिर दिया जाता है new Date() कन्स्ट्रक्टर को और फिर मोंगोडब मानदंड ऑब्जेक्ट को आपूर्ति की जाती है, मुझे लगता है कि चालक तिथि को आईएसओ तिथि में बदल देता है और क्वेरी तब काम करती है और वांछित आउटपुट देती है, हालांकि वही new Date() कन्स्ट्रक्टर काम नहीं करती है या दिखाती है रोबो मोंगो पर आउटपुट, एक ही मानदंड के लिए, जो अजीब है, क्योंकि मैंने रोबॉमोंगो का उपयोग मेरे मानदंड वस्तुओं को पार करने के लिए किया था।

जबकि डिफ़ॉल्ट क्ली ISODate और new Date() दोनों के साथ अच्छी तरह से काम करता है


MongoDB cookbook पृष्ठ टिप्पणियों से:

"dt" : 
{
    "$gte" : ISODate("2014-07-02T00:00:00Z"), 
    "$lt" : ISODate("2014-07-03T00:00:00Z") 
}

यह मेरे लिए काम किया। पूर्ण संदर्भ में, निम्न आदेश प्रत्येक रिकॉर्ड प्राप्त करता है जहां दिनांक दिनांक फ़ील्ड 2013-10-01 (YYYY-MM-DD) पर दिनांक है:

db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})

यह मेरा दस्तावेज़ है

"_id" : ObjectId("590173023c488e9a48e903d6"),
    "updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "flightId" : "590170f97cb84116075e2680",

 "_id" : ObjectId("590173023c488e9a48e903d6"),
        "updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "flightId" : "590170f97cb84116075e2680",

अब मैं हर 27 वें तारीख दस्तावेज को ढूंढना चाहता हूं। इसलिए मैंने इसका इस्तेमाल किया ....

 > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()

result:1

यह मेरे लिए काम किया।


मोंगोडीबी खोल में:

db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})

मेरे नोडजेएस कोड में (मोंगोस का उपयोग करके)

    SensorEvent.Model.find( {
        from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
    } )

मैं अपने सेंसर ईवेंट संग्रह से उन मूल्यों को वापस करने के लिए पूछताछ कर रहा हूं जहां 'से' फ़ील्ड दी गई तारीख से अधिक है





isodate