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

MongoDB Query: เพิ่ม Timestamp เฉพาะเอกสารที่ยังไม่มี


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