मोंगोडब में इसोद के साथ तिथि क्वेरी काम नहीं करती है


189

मुझे लगता है कि 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"}}
})

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

संदर्भ के लिए, इस क्वेरी का निर्माण स्प्रिंग के MongoTemplate द्वारा किया जा रहा है, इसलिए मुझे उस क्वेरी पर सीधे नियंत्रण नहीं है जो अंततः MongbDB को भेजी गई है।

(पी एस)

> db.version()
2.4.7

धन्यवाद!

जवाबों:


312

हालाँकि $date, MongoDB विस्तारित JSON का एक हिस्सा है और जो आपको डिफ़ॉल्ट रूप से मिलता है, 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 द्वारा उल्लेखित )।

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

मोंगो शेल तारीख को वापस करने के लिए विभिन्न तरीके प्रदान करता है, या तो एक स्ट्रिंग के रूप में या दिनांक वस्तु के रूप में:

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

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

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


3
हाँ। मुझे लगता है कि जब आप Queryऑब्जेक्ट को स्प्रिंग में प्रिंट करते हैं, तो मुझे वापस भेज दिया जाता है । क्वेरी का क्रमबद्ध रूप आवश्यक रूप से एक मान्य क्वेरी नहीं है जिसे आप केवल एक मोंगो शेल में कॉपी / पेस्ट कर सकते हैं, जो अपने आप में निराशाजनक है। अपराधी यहाँ है: grepcode.com/file/repo1.maven.org/maven2/org.mongodb/…
जेसन पॉलिटिक्स

2
जब एक आंशिक (कोई समय) तिथि तुलना, मैं से स्विच करना पड़ा new Date('2016-03-09')करने के लिए ISODate('2016-03-09')। पूर्व एक $gteक्वेरी के लिए अतीत में तारीखें लौटाएगा ।
मैट मोलनार

@MattMolnar नोटेड, और एक एट्रिब्यूशन के साथ उत्तर को अपडेट किया। धन्यवाद।
2032 पर जीरो 323

92

से MongoDB रसोई की किताब पेज टिप्पणियाँ:

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

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

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

1
मुझे "ISODATE अपरिभाषित" त्रुटि मिली। मैं इस समस्या को हल नहीं कर सका।
बटुहन अक्काया

@BatuhanAkkaya अजगर के साथ अजगर में, datetime.datetimeके बराबर है ISODate
jtbr

12

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

{ "dt" : { "$gte" : ISODate("2013-10-01") } }

5

मैं रॉन्गॉन्गॉन्ग को मोंगोडब क्लाइंट गुई के रूप में उपयोग कर रहा हूं और नीचे मेरे लिए काम किया गया है

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

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

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


1
टिप के लिए धन्यवाद, रोबोमोंगो मोंगियो कम्पास से बेहतर है
एलेक्स

5

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

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

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


क्वेरी चलाने में त्रुटि। कारण: (अमान्य_ओपरेटर) अमान्य ऑपरेटर: $ दिनांक
कृपाण टैबाटैबी यज़्दी

2

MongoDB शेल में:

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

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

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

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


4
ढेर अतिप्रवाह में आपका स्वागत है! कृपया प्रश्न का उत्तर केवल पोस्ट करें, न कि "यह मेरी पहली पोस्ट है" जैसे अतिरिक्त सामान। स्टैक ओवरफ्लो को विकिपीडिया समझें, संदेश बोर्ड नहीं।
डुर्रोन 597

1

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

"_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

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


0

इसने मेरे लिए काम किया, जबकि अब से कम या बराबर मूल्य की खोज की:

db.collectionName.find({ "dt": { "$lte" : new Date() + "" } });


0

पुराना सवाल है, लेकिन फिर भी पहले गूगल हिट है, इसलिए मैं इसे यहाँ पोस्ट करता हूं, इसलिए मैं इसे फिर से आसानी से ढूंढता हूं ...

मैंगो 4.2 और एक समुच्चय का उपयोग करना ():

db.collection.aggregate(
    [
     { $match: { "end_time": { "$gt": ISODate("2020-01-01T00:00:00.000Z")  } } },
     { $project: {
          "end_day": { $dateFromParts: { 'year' : {$year:"$end_time"}, 'month' : {$month:"$end_time"}, 'day': {$dayOfMonth:"$end_time"}, 'hour' : 0  } }
     }}, 
     {$group:{
        _id:   "$end_day",
        "count":{$sum:1},
    }}
   ]
)

यह आपको एक तारीख के रूप में ग्रुपबी चर देता है, कभी-कभी घटकों के रूप में सौंपने के लिए बेहतर होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.