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

MongoDB เพิ่มวันใน Date ด้วย JavaScript setDate/getDate แล้ว Update

การเพิ่ม/ลบวันใน Date Object ของ JavaScript ก่อน Update เข้า MongoDB ใช้ Method setDate() และ getDate() เนื้อหานี้สาธิตการสร้าง Date ใหม่ที่เพิ่ม 1 วัน และ 2 วัน จาก Current Date แล้ว Update เข้า Collection

ตัวอย่างข้อมูลทดสอบ

> db.demo168.insertOne({"DueDate": null});
{ "acknowledged": true, "insertedId": ObjectId("5e3695ae9e4f06af551997d6") }

แสดงข้อมูลเดิม

> db.demo168.find();
{
  "_id": ObjectId("5e3695ae9e4f06af551997d6"),
  "DueDate": null
}

JavaScript Date Manipulation และ Update

> var t = new Date();
> t.setDate(t.getDate() + 1);
1580722089017

> var dat = new Date();
> dat.setDate(dat.getDate() + 2);
1580808489085

> db.demo168.update(
  { "_id": ObjectId("5e3695ae9e4f06af551997d6") },
  {
    "$currentDate": { "DueDate": true },
    "$set": {
      "DueDate1": t,
      "DueDate2": dat
    }
  }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

ผลลัพธ์หลัง Update

> db.demo168.find();
{
  "_id": ObjectId("5e3695ae9e4f06af551997d6"),
  "DueDate": ISODate("2020-02-02T09:28:09.308Z"),
  "DueDate1": ISODate("2020-02-03T09:28:09.017Z"),
  "DueDate2": ISODate("2020-02-04T09:28:09.085Z")
}

คำอธิบาย

  • new Date(): สร้าง Date Object ปัจจุบัน
  • getDate(): ดึงวันของเดือน (1-31)
  • setDate(n): ตั้งค่าวันของเดือน (Auto-handle Month/Year Rollover)
  • t.setDate(t.getDate() + 1): เพิ่ม 1 วันจากวันปัจจุบัน
  • $currentDate: { DueDate: true }: Set DueDate = Current Server Date (MongoDB Server Time)
  • $set: { DueDate1: t, DueDate2: dat }: Set ค่า Date จาก JavaScript Variable
  • Note: setDate Mutates Object เดิม (Return Timestamp ms)

วิธีทางเลือกใน MongoDB (Server-side)

  • Aggregation $dateAdd (MongoDB 5.0+):
    db.demo168.updateOne(
      { _id: ObjectId("...") },
      [{ $set: { DueDate1: { $dateAdd: { startDate: "$$NOW", unit: "day", amount: 1 } } } }]
    )
  • Update with Aggregation Pipeline (MongoDB 4.2+):
    db.demo168.updateOne(
      { _id: ObjectId("...") },
      [{ $set: { DueDate1: { $add: ["$$NOW", 86400000] } } }]
    )
  • วิธี Server-side ดีกว่า: ใช้ Server Time, Atomic, ไม่ต้อง Round-trip