ลบองค์ประกอบออกจากอาร์เรย์ที่ไม่ตรงตามเงื่อนไขด้วย $pull และ $ne
ใช้ $pull ร่วมกับ $ne (Not Equal) เพื่อลบองค์ประกอบในอาร์เรย์ที่ ไม่ตรง ตามเงื่อนไขที่กำหนด
ตัวอย่างข้อมูลทดสอบ
> db.demo410.insertOne({
details: [
{ isMarried: false },
{ isMarried: true },
{ isMarried: false },
{ isMarried: "Chris" }
]
});
แสดงข้อมูลก่อนลบ
> db.demo410.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "details": [{ "isMarried": false }, { "isMarried": true }, { "isMarried": false }, { "isMarried": "Chris" }] }
คำสั่งลบองค์ประกอบที่ isMarried ไม่เท่ากับ true
> db.demo410.updateMany(
{ "details": { $elemMatch: { "isMarried": { $ne: true } } } },
{ $pull: { "details": { "isMarried": { $ne: true } } } }
);
ผลลัพธ์: { "acknowledged": true, "matchedCount": 1, "modifiedCount": 1 }
แสดงข้อมูลหลังลบ
> db.demo410.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "details": [{ "isMarried": true }] }
คำอธิบาย
- Query: { "details": { $elemMatch: { "isMarried": { $ne: true } } } }: หาเอกสารที่มีอาร์เรย์ details ประกอบด้วยอย่างน้อย 1 องค์ประกอบที่ isMarried ≠ true
- Update: { $pull: { "details": { "isMarried": { $ne: true } } } }: ลบ ทุก องค์ประกอบใน details ที่ isMarried ≠ true
- เหลือเฉพาะองค์ประกอบที่ isMarried = true
ความแตกต่างระหว่าง Query และ Update Condition
- Query ($elemMatch): ต้องมีอย่างน้อย 1 ตัว match -> เลือกเอกสารที่จะอัปเดต
- Update ($pull condition): ลบ ทุกตัว ที่ match เงื่อนไขในอาร์เรย์ของเอกสารนั้นๆ
ตัวดำเนินการเปรียบเทียบที่เกี่ยวข้อง
| Operator | ความหมาย |
|---|---|
| $eq | เท่ากับ |
| $ne | ไม่เท่ากับ |
| $gt/$gte | มากกว่า / มากกว่าหรือเท่ากับ |
| $lt/$lte | น้อยกว่า / น้อยกว่าหรือเท่ากับ |
| $in/$nin | อยู่ใน / ไม่อยู่ใน อาร์เรย์ |