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

การดึงข้อมูล MongoDB จากเดือนก่อนหน้า

Query ข้อมูลเดือนก่อนหน้าใน MongoDB

บทความนี้สาธิตวิธีการคำนวณวันที่ "1 เดือนก่อน" จากวันที่ปัจจุบัน แล้วใช้ใน $gte เพื่อดึงข้อมูลของเดือนก่อนหน้า

ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง

> db.findOneMonthAgoData.insertOne({"CustomerName":"Chris","PurchaseDate":new ISODate("2019-12-26")});
{ "acknowledged": true, "insertedId": ObjectId("5e04e16c150ee0e76c06a04f") }
> db.findOneMonthAgoData.insertOne({"CustomerName":"David","PurchaseDate":new ISODate("2019-11-26")});
{ "acknowledged": true, "insertedId": ObjectId("5e04e178150ee0e76c06a050") }
> db.findOneMonthAgoData.insertOne({"CustomerName":"Bob","PurchaseDate":new ISODate("2020-11-26")});
{ "acknowledged": true, "insertedId": ObjectId("5e04e186150ee0e76c06a051") }

ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด

> db.findOneMonthAgoData.find();

ขั้นตอนที่ 3: คำนวณวันที่ 1 เดือนก่อน และ Query

ใน Mongo Shell:

> monthData = new Date(); // สมมติวันนี้ 2019-12-26
ISODate("2019-12-26T16:43:04.283Z")
> monthData.setMonth(monthData.getMonth() - 1); // ลบ 1 เดือน
1574786584283 (Timestamp)
> db.findOneMonthAgoData.find({PurchaseDate: {$gte: monthData}});

ผลลัพธ์ที่ได้

{ "_id": ObjectId("5e04e16c150ee0e76c06a04f"), "CustomerName": "Chris", "PurchaseDate": ISODate("2019-12-26T00:00:00Z") }
{ "_id": ObjectId("5e04e186150ee0e76c06a051"), "CustomerName": "Bob", "PurchaseDate": ISODate("2020-11-26T00:00:00Z") }

หมายเหตุ: ตัวอย่างนี้รันใน Shell ที่วันที่จำลองเป็น 2019-12-26 ดังนั้น "1 เดือนก่อน" = 2019-11-26 จึงจับเอกสาร Chris (26 Dec) และ Bob (26 Nov 2020) แต่ David (26 Nov 2019) อยู่พอดีขอบเขต (อาจรวมหรือไม่รวมขึ้นกับเวลา)

แนวทางปฏิบัติที่ดีกว่า (Best Practice): ใช้ $dateSubtract (MongoDB 5.0+) หรือคำนวณวันที่ใน Application Layer แล้วส่งมาเป็น ISODate Parameter แทนการคำนวณใน Shell