แบบสอบถามผลตอบแทนตามวันที่


209

ฉันมีข้อมูลเช่นนี้ใน MongoDB

{ 
    "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??})อย่างไรเพื่อที่จะส่งคืนผลลัพธ์ข้างต้นให้ฉันจาก db?


มันจะมีประสิทธิภาพที่จะกล่าวถึงว่าคุณใช้ห้องสมุด nodejs แต่จากตัวอย่างมันดูเหมือนว่า mongoosejs
Grimnoff

คำตอบ:


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
Ahh :) ฉันคิดว่าคุณกำลังใช้คอนโซล Mongo นั่นISODateคือ wrapper สำหรับวัตถุ js Date "createdAt" : new Date("2010-01-01")ลองสิ่งที่ต้องการ ด้วยเหตุผลบางอย่างรหัสนั้นใช้ไม่ได้ (สำหรับ v. 2.0.2) ในคอนโซล Mongo อย่างไรก็ตาม
mnemosyn

การกำหนดวันที่จะใช้เครื่องหมายทับแทนเครื่องหมายขีดกลางหรือไม่ เช่น:new Date("2010/01/01");
Victor S

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()ส่งกลับมิลลิวินาทีคุณจะต้องทวีคูณเป็น 1,000 ก่อนที่คุณจะใช้มันเป็นอินพุทของคอนnew Date()สตรัคเตอร์

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 นาที (เป็น ms) จากนั้น: 5*60*1000- ฉันแค่คูณด้วย60วินาทีเพื่อให้ง่ายต่อการเปลี่ยนแปลง ฉันสามารถเปลี่ยน5เป็น120ถ้าฉันต้องการ 2 ชั่วโมง (120 นาที)
  3. new Date().getTime()-60*5*1000ให้เรา1484383878676(5 นาทีที่แล้วในหน่วยมิลลิวินาที)

ตอนนี้เราต้องป้อนข้อมูลนั้นให้เป็นตัวnew Date()สร้างเพื่อให้ได้รูปแบบสตริง ISO ที่ต้องการโดยการประทับเวลา MongoDB

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find () แบบสอบถาม)
  2. เนื่องจากเราไม่สามารถมีตัวแปรเราจึงทำได้ทั้งหมดในนัดเดียว: new Date(new Date().getTime()-60*5*1000)
  3. ... จากนั้นแปลงเป็นสตริง ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() ให้เรา 2017-01-14T08:53:17.586Z

แน่นอนว่านี่เป็นเรื่องง่ายขึ้นเล็กน้อยเกี่ยวกับตัวแปรถ้าคุณใช้ไดรเวอร์ node-mongodb-native แต่สิ่งนี้ทำงานได้ในเชลล์ mongo ซึ่งเป็นสิ่งที่ฉันมักใช้ตรวจสอบสิ่งต่าง ๆ


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))
      } 
    })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.