ใช้ distinct() และ $in เพื่อดึง _id เป็นอาร์เรย์แทน JSON Array
เมื่อต้องการได้ผลลัพธ์เป็นอาร์เรย์ของค่า _id (แทนที่จะเป็น JSON array ของเอกสารเต็ม) สำหรับเอกสารที่มีค่ามากกว่า 50 สามารถใช้ distinct() ร่วมกับ $gt และ $in ได้
ตัวอย่างข้อมูลทดสอบ
> db.demo50.save({ "Value": 40 });
> db.demo50.save({ "Value": 100 });
> db.demo50.save({ "Value": 20 });
> db.demo50.save({ "Value": 510 });
แสดงข้อมูลทั้งหมด
> db.demo50.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "Value": 40 }
{ "_id": ObjectId("..."), "Value": 100 }
{ "_id": ObjectId("..."), "Value": 20 }
{ "_id": ObjectId("..."), "Value": 510 }
คำสั่งดึง _id ของเอกสารที่ Value > 50
> listOfValues = db.demo50.distinct("_id", { Value: { $gt: 50 } });
> db.demo50.find({ _id: { $in: listOfValues } });
ผลลัพธ์ที่ได้
{ "_id": ObjectId("..."), "Value": 100 }
{ "_id": ObjectId("..."), "Value": 510 }
คำอธิบาย
- distinct("_id", { Value: { $gt: 50 } }): ดึงเฉพาะค่า _id ที่ไม่ซ้ำกันของเอกสารที่ Value > 50
- $in: ใช้ค่า _id ที่ได้มาเป็นเงื่อนไขค้นหาเอกสารเต็ม
หมายเหตุ: ใน MongoDB ใหม่ๆ สามารถใช้ projection ใน find() ได้โดยตรง:
> db.demo50.find({ Value: { $gt: 50 } }, { _id: 1, Value: 1 });
ซึ่งจะคืนเอกสารที่มีเฉพาะ _id และ Value โดยไม่ต้องทำ 2 ขั้นตอน