ใช้ Operator $gte (Greater Than or Equal) ร่วมกับ Object Date() เพื่อค้นหาเอกสารที่มีฟิลด์วันที่อยู่ในช่วง 7 วันที่ผ่านมา
ข้อมูลอ้างอิง: วันที่ปัจจุบันของระบบ
> new Date();
ISODate("2019-05-14T08:32:42.773Z")
สร้างคอลเลกชันและข้อมูลตัวอย่าง (ShippingDate)
> db.findObectInLastWeekDemo.insertOne({"ShippingDate": new ISODate("2019-05-01")});
{ "acknowledged": true, "insertedId": ObjectId("5cda7dc4bf3115999ed511e0") }
> db.findObectInLastWeekDemo.insertOne({"ShippingDate": new ISODate("2019-05-02")});
{ "acknowledged": true, "insertedId": ObjectId("5cda7dc4bf3115999ed511e1") }
> db.findObectInLastWeekDemo.insertOne({"ShippingDate": new ISODate("2019-05-08")});
{ "acknowledged": true, "insertedId": ObjectId("5cda7dc4bf3115999ed511e2") }
> db.findObectInLastWeekDemo.insertOne({"ShippingDate": new ISODate("2019-05-07")});
{ "acknowledged": true, "insertedId": ObjectId("5cda7dc4bf3115999ed511e3") }
> db.findObectInLastWeekDemo.insertOne({"ShippingDate": new ISODate("2019-05-09")});
{ "acknowledged": true, "insertedId": ObjectId("5cda7dc4bf3115999ed511e4") }
> db.findObectInLastWeekDemo.insertOne({"ShippingDate": new ISODate("2019-04-26")});
{ "acknowledged": true, "insertedId": ObjectId("5cda7dc4bf3115999ed511e5") }
แสดงข้อมูลทั้งหมด
> db.findObectInLastWeekDemo.find().pretty();
ผลลัพธ์:
{"_id": ObjectId("5cda7dc4bf3115999ed511e0"), "ShippingDate": ISODate("2019-05-01T00:00:00Z")}
{"_id": ObjectId("5cda7dc4bf3115999ed511e1"), "ShippingDate": ISODate("2019-05-02T00:00:00Z")}
{"_id": ObjectId("5cda7dc4bf3115999ed511e2"), "ShippingDate": ISODate("2019-05-08T00:00:00Z")}
{"_id": ObjectId("5cda7dc4bf3115999ed511e3"), "ShippingDate": ISODate("2019-05-07T00:00:00Z")}
{"_id": ObjectId("5cda7dc4bf3115999ed511e4"), "ShippingDate": ISODate("2019-05-09T00:00:00Z")}
{"_id": ObjectId("5cda7dc4bf3115999ed511e5"), "ShippingDate": ISODate("2019-04-26T00:00:00Z")}
คำสั่ง: ค้นหาเอกสารใน 7 วันที่ผ่านมา (จาก 2019-05-14)
> db.findObectInLastWeekDemo.find({
ShippingDate: {
$gte: new Date(new Date() - 7 * 60 * 60 * 24 * 1000)
}
});
คำนวณ: new Date() - 7 * 60 * 60 * 24 * 1000 = ลบ 7 วัน (มิลลิวินาที)
ผลลัพธ์ (เฉพาะ 8 และ 9 พฤษภาคม ที่อยู่ในช่วง 7 วันย้อนหลัง):
{"_id": ObjectId("5cda7dc4bf3115999ed511e2"), "ShippingDate": ISODate("2019-05-08T00:00:00Z")}
{"_id": ObjectId("5cda7dc4bf3115999ed511e4"), "ShippingDate": ISODate("2019-05-09T00:00:00Z")}
รูปแบบอื่นที่ใช้งานได้
- ใช้
ISODate()โดยตรง:{$gte: ISODate("2019-05-07")} - ใช้
new Date("2019-05-07") - Aggregation:
{$match: {ShippingDate: {$gte: {$subtract: [new Date(), 7*24*60*60*1000]}}}} - รวมช่วงเวลา:
{$gte: startDate, $lte: endDate}
หมายเหตุ
- ฟิลด์วันที่ควรเก็บเป็น
ISODate(BSON Date) ไม่ใช่ String เพื่อ Query ได้ถูกต้อง - Index บนฟิลด์วันที่จะทำให้ Query เร็วขึ้นมาก
- Timezone: MongoDB เก็บเป็น UTC ต้องระวังการแปลง Timezone ใน Application Layer