การเพิ่ม/ลบวันใน 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:
setDateMutates 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