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

Insert ฟิลด์ใน MongoDB เฉพาะเมื่อฟิลด์นั้น Missing (Not Exist) ด้วย $exists: false

ใช้ 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: เปลี่ยนชื่อฟิลด์