दिनांक के आधार पर क्वेरी वापस करें


209

मेरे पास मोंगोडब में इस तरह का एक डेटा है

{ 
    "latitude" : "", 
    "longitude" : "", 
    "course" : "", 
    "battery" : "0", 
    "imei" : "0", 
    "altitude" : "F:3.82V", 
    "mcc" : "07", 
    "mnc" : "007B", 
    "lac" : "2A83", 
    "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), 
    "createdAt" : ISODate("2012-01-12T20:15:31Z") 
}

मैं कैसे क्वेरी करूं db.gpsdatas.find({'createdAt': ??what here??}), ताकि यह उपरोक्त डेटा परिणाम डीबी से मेरे पास लौटाए?


यह उल्लेख करना प्रभावी रहा होगा कि आप किस नोडज लाइब्रेरी का उपयोग कर रहे हैं, लेकिन उदाहरण के आधार पर ऐसा प्रतीत होता है कि इसके
मोंगोज़ोज़

जवाबों:


421

आप शायद एक श्रेणी क्वेरी बनाना चाहते हैं, उदाहरण के लिए, दी गई तारीख के बाद बनाई गई सभी आइटम:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

मैं $gte(अधिक से अधिक या बराबर) का उपयोग कर रहा हूं , क्योंकि यह अक्सर दिनांक-केवल प्रश्नों के लिए उपयोग किया जाता है, जहां समय घटक 00:00:00 है।

यदि आप वास्तव में ऐसी तिथि ढूंढना चाहते हैं जो किसी अन्य तिथि के बराबर हो, तो वाक्यविन्यास होगा

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });

14
आह :) मुझे लगा कि आप मोंगो कंसोल का उपयोग कर रहे हैं। वहाँ, ISODateजे एस दिनांक वस्तु के लिए एक आवरण है। कुछ ऐसा आजमाएं "createdAt" : new Date("2010-01-01")। किसी कारण से, यह कोड मोंगो कंसोल में काम नहीं करता है (v। 2.0.2 के लिए), हालांकि।
मेमनोसिन

क्या डेट इनिशियलाइज़ेशन डैश की बजाय स्लैश का उपयोग करेगा? जैसे:new Date("2010/01/01");
विक्टर एस

16

यदि आप उस तारीख को कहीं भी आइटम प्राप्त करना चाहते हैं, तो आपको दो तिथियों की तुलना करने की आवश्यकता है

आप दिन की शुरुआत और दिन के अंत को प्राप्त करने के लिए इस तरह से पहले की दो तिथियां बना सकते हैं।

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")

startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);

var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);

### MONGO QUERY

var query = {
        inserted_at: {
                    $gt:morning,
                    $lt:dateScrapedMidnight
        }
};

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)

16

बस Mongo v3.2.3 में Node v0.12.7 और v4.4.4 का उपयोग करके कुछ इसी तरह से लागू किया गया है और इसका इस्तेमाल किया गया है:

{ $gte: new Date(dateVar).toISOString() }

मैं एक ISODATE (जैसे 2016-04-22T00: 00: 00Z) में पास हो रहा हूं और यह एक .find () क्वेरी के लिए या toISOString फ़ंक्शन के बिना काम कर रहा है। लेकिन जब एक .aggregate () $ माचिस क्वेरी का उपयोग किया जाता है, तो यह toISOString फ़ंक्शन को पसंद नहीं करता है!


12

यदि आप पिछले 5 मिनट में सभी नई चीजें प्राप्त करना चाहते हैं, तो आपको कुछ गणनाएं करनी होंगी, लेकिन यह कठिन नहीं है ...

पहले उस संपत्ति पर एक इंडेक्स बनाएं जिसे आप मैच करना चाहते हैं (अवरोही क्रम के लिए क्रमांक -1 और आरोही के लिए 1 शामिल करें)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

फिर अंतिम 5 मिनट (60 सेकंड * 5 मिनट) में बनाए गए दस्तावेज़ों के लिए क्वेरी करें ... क्योंकि जावास्क्रिप्ट के .getTime()रिटर्न मिलिसेकंड्स आपको new Date()निर्माणकर्ता के इनपुट के रूप में उपयोग करने से पहले 1000 तक की गणना करने की आवश्यकता है ।

db.things.find({
        createdAt: {
            $gte: new Date(new Date().getTime()-60*5*1000).toISOString()
         }
     })
     .count()

इसके लिए स्पष्टीकरण new Date(new Date().getTime()-60*5*1000).toISOString()इस प्रकार है:

पहले हम "5 मिनट पहले" की गणना करते हैं:

  1. new Date().getTime() हमें मिलीसेकंड में वर्तमान समय देता है
  2. हम उस से 5 मिनट (एमएस में) घटाना चाहते हैं: 5*60*1000- मैं सिर्फ 60सेकंड से गुणा करता हूं ताकि इसका बदलना आसान हो। मैं तो बस बदल सकते हैं 5करने के लिए 120अगर मैं 2 घंटे (120 मिनट) चाहते हैं।
  3. new Date().getTime()-60*5*1000हमें देता है 1484383878676(5 मिनट पहले ms में)

अब हमें यह सुनिश्चित करने की new Date()आवश्यकता है कि MongoDB टाइमस्टैम्प द्वारा ISO स्ट्रिंग प्रारूप प्राप्त करने के लिए एक निर्माणकर्ता में ।

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find () क्वेरी)
  2. चूँकि हमारे पास वैरिएबल नहीं हो सकते हैं इसलिए हम यह सब एक शॉट में करते हैं: new Date(new Date().getTime()-60*5*1000)
  3. ... तो आईएसओ स्ट्रिंग में परिवर्तित करें: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() हमें देता है 2017-01-14T08:53:17.586Z

यदि आप नोड-मोंगोडब-देशी ड्राइवर का उपयोग कर रहे हैं, तो निश्चित रूप से यह चर के साथ थोड़ा आसान है, लेकिन यह मोंगो शेल में काम करता है जो कि मैं आमतौर पर चीजों की जांच करने के लिए उपयोग करता हूं।


1
मुझे लगता है कि आप Date.now()इसके बजाय का उपयोग कर सकते हैंnew Date().getTime()
Béranger


2

यदि आप मानगो का उपयोग कर रहे हैं,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

किसी विशिष्ट तिथि के साथ खोजें:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

अधिक gteया कम के साथ खोजें lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

रेंज द्वारा खोजें:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.