การดึงเอกสารหลายรายการจาก MongoDB ด้วย Array ของ _id
ใช่ สามารถดึงเอกสารหลายรายการพร้อมกันได้โดยใช้ 오อเปอเรเตอร์ $in ร่วมกับ array ของ _id ที่ต้องการ
ไวยากรณ์
db.yourCollectionName.find({_id: {$in: [yourValue1, yourValue2, yourValue3, ...N]}});
ตัวอย่างการสร้างคอลเลกชันและเพิ่มข้อมูล (ใช้ _id แบบกำหนดเอง)
> db.retrieveMultipleDocsByIdDemo.insertOne({"_id":10,"CustomerName":"John"});
{ "acknowledged" : true, "insertedId" : 10 }
> db.retrieveMultipleDocsByIdDemo.insertOne({"_id":14,"CustomerName":"Chris"});
{ "acknowledged" : true, "insertedId" : 14 }
> db.retrieveMultipleDocsByIdDemo.insertOne({"_id":20,"CustomerName":"Robert"});
{ "acknowledged" : true, "insertedId" : 20 }
> db.retrieveMultipleDocsByIdDemo.insertOne({"_id":25,"CustomerName":"Sam"});
{ "acknowledged" : true, "insertedId" : 25 }
> db.retrieveMultipleDocsByIdDemo.insertOne({"_id":30,"CustomerName":"Bob"});
{ "acknowledged" : true, "insertedId" : 30 }
> db.retrieveMultipleDocsByIdDemo.insertOne({"_id":34,"CustomerName":"Carol"});
{ "acknowledged" : true, "insertedId" : 34 }
แสดงข้อมูลทั้งหมด
> db.retrieveMultipleDocsByIdDemo.find().pretty();
ผลลัพธ์:
{ "_id" : 10, "CustomerName" : "John" }
{ "_id" : 14, "CustomerName" : "Chris" }
{ "_id" : 20, "CustomerName" : "Robert" }
{ "_id" : 25, "CustomerName" : "Sam" }
{ "_id" : 30, "CustomerName" : "Bob" }
{ "_id" : 34, "CustomerName" : "Carol" }
ค้นหาเอกสารที่ _id เป็น 10, 20, 30
> db.retrieveMultipleDocsByIdDemo.find({_id: {$in: [10, 20, 30]}});
ผลลัพธ์:
{ "_id" : 10, "CustomerName" : "John" }
{ "_id" : 20, "CustomerName" : "Robert" }
{ "_id" : 30, "CustomerName" : "Bob" }
การใช้งานกับ ObjectId (รูปแบบทั่วไป)
> db.collection.find({
_id: {
$in: [
ObjectId("5c9cd7d6a629b87623db1b19"),
ObjectId("5c9cd7dea629b87623db1b1a"),
ObjectId("5c9cd7e9a629b87623db1b1b")
]
}
});
ข้อดีของ $in
- Single Round Trip: ดึงข้อมูลหลายรายการในคำสั่งเดียว ลด Network Latency
- Index Support: ใช้ Index บน _id ได้อย่างมีประสิทธิภาพ
- Order: ผลลัพธ์อาจไม่เรียงตามลำดับใน array $in (ใช้ sort() ถ้าต้องการ)
ข้อจำกัด
- ขนาด Array: $in array ควรไม่เกิน 100,000 elements (ข้อจำกัดของ BSON document size 16MB)
- ประสิทธิภาพ: Array ใหญ่มากอาจทำให้ Query Plan เปลี่ยนจาก Index Scan เป็น Collection Scan
การรักษาลำดับผลลัพธ์ตาม Array $in
> var ids = [10, 20, 30];
> var docs = db.retrieveMultipleDocsByIdDemo.find({_id: {$in: ids}}).toArray();
> // เรียงลำดับใน Application layer
> docs.sort(function(a, b) { return ids.indexOf(a._id) - ids.indexOf(b._id); });
เทคนิคนี้เหมาะสำหรับการดึงข้อมูลหลายรายการพร้อมกัน เช่น การแสดงรายการสินค้าที่ผู้ใช้เลือกในตะกร้าสินค้า