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

ค้นหาเอกสารที่สร้างในสัปดาห์ที่ผ่านมาใน MongoDB

ใช้ 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