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

MongoDB อัปเดตเอกสารแรกเท่านั้น (Upsert) เพิ่ม Field ใหม่

Method update() โดย Default จะอัปเดตเฉพาะเอกสารแรกที่ Match (Single Document Update) เนื้อหานี้สาธิตการเพิ่ม Field StudentAge ให้กับเอกสารแรกใน Collection พร้อม upsert: true

ตัวอย่างข้อมูลทดสอบ

> db.demo162.insertOne({"StudentName":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3684359e4f06af551997c2") }

> db.demo162.insertOne({"StudentName":"Bob"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3684389e4f06af551997c3") }

> db.demo162.insertOne({"StudentName":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e36843c9e4f06af551997c4") }

แสดงข้อมูลเดิม (มี StudentAge อยู่แล้วใน Doc แรก)

> db.demo162.find();
{
  "_id" : ObjectId("5e3684359e4f06af551997c2"),
  "StudentName" : "Chris",
  "StudentAge" : 23
}
{
  "_id" : ObjectId("5e3684389e4f06af551997c3"),
  "StudentName" : "Bob"
}
{
  "_id" : ObjectId("5e36843c9e4f06af551997c4"),
  "StudentName" : "David"
}

Query Update เอกสารแรก (Empty Filter {})

> db.demo162.update(
  {},
  {$set: {"StudentAge": 23}},
  {upsert: true}
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ผลลัพธ์ (เพิ่ม StudentAge ให้ Doc แรกเท่านั้น)

> db.demo162.find();
{
  "_id" : ObjectId("5e3684359e4f06af551997c2"),
  "StudentName" : "Chris",
  "StudentAge" : 23
}
{
  "_id" : ObjectId("5e3684389e4f06af551997c3"),
  "StudentName" : "Bob"
}
{
  "_id" : ObjectId("5e36843c9e4f06af551997c4"),
  "StudentName" : "David"
}

คำอธิบายและ Syntax ใหม่

  • Filter {} = Match ทุกเอกสาร, แต่ update() Default = Single Document (multi: false)
  • อัปเดตเอกสารแรกตาม Natural Order (ปกติคือ Insertion Order)
  • upsert: true: หากไม่ Match ใดๆ จะ Insert Document ใหม่ด้วย Filter + Update
  • Modern Syntax (MongoDB 3.2+):
    • updateOne({}, {$set: {StudentAge: 23}}, {upsert: true}) - อัปเดต 1 Doc
    • updateMany({}, {$set: {StudentAge: 23}}, {upsert: true}) - อัปเดตทั้งหมด
  • WriteResult: nMatched=1, nModified=1 แสดงว่ามี 1 Doc Match และถูกแก้ไข