ใช้ Query Condition {$exists: false} ร่วมกับ $set และ multi: true เพื่อเพิ่มฟิลด์ใหม่เฉพาะในเอกสารที่ยังไม่มีฟิลด์นั้น (Upsert แบบ Conditional)
สร้างคอลเลกชันและข้อมูลตัวอย่าง (บางเอกสารมี Age บางอันไม่มี)
> db.missingDocumentDemo.insertOne({"StudentFirstName": "Adam", "StudentLastName": "Smith"});
{ "acknowledged": true, "insertedId": ObjectId("5cd3fb1eedc6604c74817ce6") }
> db.missingDocumentDemo.insertOne({"StudentFirstName": "Carol", "StudentLastName": "Taylor"});
{ "acknowledged": true, "insertedId": ObjectId("5cd3fb29edc6604c74817ce7") }
> db.missingDocumentDemo.insertOne({"StudentFirstName": "David", "StudentLastName": "Miller", "StudentAge": 21});
{ "acknowledged": true, "insertedId": ObjectId("5cd3fb40edc6604c74817ce8") }
แสดงข้อมูลก่อนอัปเดต
> db.missingDocumentDemo.find().pretty();
ผลลัพธ์: Adam และ Carol ไม่มี StudentAge, David มีแล้ว (21)
คำสั่ง: เพิ่ม StudentAge = 23 เฉพาะเอกสารที่ยังไม่มีฟิลด์นี้
> db.missingDocumentDemo.update(
{"StudentAge": {$exists: false}},
{$set: {"StudentAge": 23}},
{multi: true}
);
WriteResult({ "nMatched": 2, "nUpserted": 0, "nModified": 2 })
ตรวจสอบผลลัพธ์
> db.missingDocumentDemo.find().pretty();
Adam และ Carol ได้ Age = 23 เพิ่มเข้ามา | David คงค่าเดิม (21) ไม่เปลี่ยน
{
"_id": ObjectId("5cd3fb1eedc6604c74817ce6"),
"StudentFirstName": "Adam",
"StudentLastName": "Smith",
"StudentAge": 23
}
{
"_id": ObjectId("5cd3fb29edc6604c74817ce7"),
"StudentFirstName": "Carol",
"StudentLastName": "Taylor",
"StudentAge": 23
}
{
"_id": ObjectId("5cd3fb40edc6604c74817ce8"),
"StudentFirstName": "David",
"StudentLastName": "Miller",
"StudentAge": 21
}
รายละเอียด
{$exists: false}Match เอกสารที่ ไม่มีฟิลด์นั้นเลย (รวม Missing และ Null? → ไม่รวม Null, Null ถือว่ามี Field)multi: trueอัปเดตทุกเอกสารที่ Match (Default false = แค่ตัวแรก)- David ที่มี Age = 21 อยู่แล้ว → ไม่ Match Query → ไม่ถูกอัปเดต
รูปแบบใหม่ (MongoDB 3.2+): updateMany
db.missingDocumentDemo.updateMany(
{"StudentAge": {$exists: false}},
{$set: {"StudentAge": 23}}
);
กรณี: Field มีอยู่แต่เป็น Null → ต้องการเซตค่าใหม่
// Match ทั้ง Missing และ Null
{$or: [{"StudentAge": {$exists: false}}, {"StudentAge": null}]}
// หรือ ใช้ $type
{"StudentAge": {$in: [null, {$exists: false}]}} // ไม่ได้ syntax นี้
// ถูกต้อง:
{$or: [{"StudentAge": {$exists: false}}, {"StudentAge": null}]}
Operator ที่เกี่ยวข้อง
$setOnInsert: เซตค่าเฉพาะตอน Upsert (Insert ใหม่) ไม่เซตตอน Update$unset: ลบฟิลด์ออก$rename: เปลี่ยนชื่อฟิลด์