ใช้ update() พร้อม upsert:false, multi:true และ $exists: false
เพื่อเพิ่มฟิลด์ timestamp เฉพาะเอกสารที่ยังไม่มีฟิลด์นั้น ให้ใช้ query { field: { $exists: false } } ร่วมกับ multi: true
ตัวอย่างข้อมูล
> db.demo479.insertOne({ "DueDate": new ISODate("2020-01-10"), "Name": "Chris" });
> db.demo479.insertOne({ "Name": "David" });
> db.demo479.insertOne({ "DueDate": new ISODate("2019-12-31"), "Name": "Bob" });
> db.demo479.insertOne({ "Name": "Carol" });
Query เพิ่ม DueDate ให้เอกสารที่ขาด
> db.demo479.update(
{ DueDate: { $exists: false } },
{ $set: { "DueDate": new Date() } },
{ upsert: false, multi: true }
);
WriteResult({ "nMatched": 2, "nUpserted": 0, "nModified": 2 })
ผลลัพธ์
{ "_id": ObjectId(...), "DueDate": ISODate("2020-01-10T00:00:00Z"), "Name": "Chris" }
{ "_id": ObjectId(...), "Name": "David", "DueDate": ISODate("2020-03-30T14:52:29.656Z") }
{ "_id": ObjectId(...), "DueDate": ISODate("2019-12-31T00:00:00Z"), "Name": "Bob" }
{ "_id": ObjectId(...), "Name": "Carol", "DueDate": ISODate("2020-03-30T14:52:29.656Z") }
คำอธิบายพารามิเตอร์
{ DueDate: { $exists: false } }- Match เอกสารที่ **ไม่มี** ฟิลด์ DueDate{ $set: { "DueDate": new Date() } }- ตั้งค่า DueDate = เวลาปัจจุบันupsert: false- ไม่สร้างเอกสารใหม่ถ้าไม่เจอ (default)multi: true- อัปเดต **ทุก** เอกสารที่ match (default false ในรุ่นเก่า)
รูปแบบใหม่ (MongoDB 3.2+)
// updateMany - อัปเดตทุกเอกสารที่ match (multi: true default)
db.demo479.updateMany(
{ DueDate: { $exists: false } },
{ $set: { "DueDate": new Date() } }
);
การใช้ $currentDate (MongoDB 4.2+)
db.demo479.updateMany(
{ DueDate: { $exists: false } },
{ $currentDate: { DueDate: true } } // ตั้งค่าเป็น current date/time อัตโนมัติ
);
Use Cases
- Backfill timestamp field สำหรับข้อมูลเก่า
- เพิ่ม createdAt/updatedAt ให้ collection ที่มีอยู่
- Migration script สำหรับ schema evolution