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

สามารถดึงเอกสารหลายรายการจาก MongoDB ด้วย ID ได้หรือไม่

การดึงเอกสารหลายรายการจาก 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); });

เทคนิคนี้เหมาะสำหรับการดึงข้อมูลหลายรายการพร้อมกัน เช่น การแสดงรายการสินค้าที่ผู้ใช้เลือกในตะกร้าสินค้า