Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ค้นหาข้อมูลวันที่เท่ากับหรือหลังวันที่กำหนดใน MongoDB

การ query ข้อมูลที่มีวันที่มากกว่าหรือเท่ากับวันที่กำหนด ใช้ operator $gte (greater than or equal) กับ ISODate

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo91.insertOne({"ArrivalDate":new ISODate("2020-01-10")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d49fd79799acab037af66") }
> db.demo91.insertOne({"ArrivalDate":new ISODate("2019-12-14")});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d4a0679799acab037af67") }

แสดงข้อมูลทั้งหมด

> db.demo91.find();

ผลลัพธ์:

{ "_id" : ObjectId("5e2d49fd79799acab037af66"), "ArrivalDate" : ISODate("2020-01-10T00:00:00Z") }
{ "_id" : ObjectId("5e2d4a0679799acab037af67"), "ArrivalDate" : ISODate("2019-12-14T00:00:00Z") }

Query หาข้อมูลวันที่ >= 2020-01-10

> db.demo91.find({ArrivalDate: { $gte: ISODate('2020-01-10') } });

ผลลัพธ์

{ "_id" : ObjectId("5e2d49fd79799acab037af66"), "ArrivalDate" : ISODate("2020-01-10T00:00:00Z") }

ได้เฉพาะเอกสารที่ ArrivalDate = 2020-01-10 (เท่ากับ) เอกสาร 2019-12-14 ถูกตัดออก

Operator เปรียบเทียบวันที่ที่ใช้บ่อย:

Query ช่วงวันที่ (Range Query)

หาข้อมูลระหว่าง 2 วันที่:

db.demo91.find({
  ArrivalDate: {
    $gte: ISODate("2020-01-01"),
    $lte: ISODate("2020-12-31")
  }
})

ใช้กับ Date ที่เก็บเป็น String

หากวันที่เก็บเป็น string ต้องแปลงก่อน (MongoDB 4.0+):

db.collection.aggregate([
  { $addFields: { dateObj: { $toDate: "$dateString" } } },
  { $match: { dateObj: { $gte: ISODate("2020-01-10") } } }
])

แนวทางปฏิบัติที่ดี: ควรเก็บวันที่เป็น ISODate (native Date type) เพื่อ query ได้เร็วและแม่นยำที่สุด

Operatorความหมายตัวอย่าง
$gtมากกว่า (strictly greater){$gt: ISODate("2020-01-10")} → หลัง 10 ม.ค.
$gteมากกว่าหรือเท่ากับ{$gte: ISODate("2020-01-10")} → 10 ม.ค. ขึ้นไป
$ltน้อยกว่า{$lt: ISODate("2020-01-10")} → ก่อน 10 ม.ค.
$lteน้อยกว่าหรือเท่ากับ{$lte: ISODate("2020-01-10")} → 10 ม.ค. ย้อนหลัง