Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách truy xuất nhiều tài liệu theo _id trong MongoDB

Giới thiệu

Để truy xuất nhiều tài liệu bằng danh sách _id, bạn sử dụng toán tử $in trong truy vấn find().

Cú pháp

db.tenCollection.find({ _id: { $in: [ ObjectId1, ObjectId2, ObjectId3, ... ] } });

Ví dụ minh họa

1. Tạo collection với _id tùy chỉnh

> db.layNhieuId.insertOne({ "_id": 10, "TenKhachHang": "John" });
{ "acknowledged" : true, "insertedId" : 10 }
> db.layNhieuId.insertOne({ "_id": 14, "TenKhachHang": "Chris" });
{ "acknowledged" : true, "insertedId" : 14 }
> db.layNhieuId.insertOne({ "_id": 20, "TenKhachHang": "Robert" });
{ "acknowledged" : true, "insertedId" : 20 }
> db.layNhieuId.insertOne({ "_id": 25, "TenKhachHang": "Sam" });
{ "acknowledged" : true, "insertedId" : 25 }
> db.layNhieuId.insertOne({ "_id": 30, "TenKhachHang": "Bob" });
{ "acknowledged" : true, "insertedId" : 30 }
> db.layNhieuId.insertOne({ "_id": 34, "TenKhachHang": "Carol" });
{ "acknowledged" : true, "insertedId" : 34 }

2. Truy xuất 3 tài liệu theo _id: 10, 20, 30

> db.layNhieuId.find({ _id: { $in: [10, 20, 30] } });

3. Kết quả

{ "_id" : 10, "TenKhachHang" : "John" }
{ "_id" : 20, "TenKhachHang" : "Robert" }
{ "_id" : 30, "TenKhachHang" : "Bob" }

Với ObjectId (mặc định)

var ids = [
    ObjectId("5c9cd7d6a629b87623db1b19"),
    ObjectId("5c9cd7dea629b87623db1b1a"),
    ObjectId("5c9cd7e9a629b87623db1b1b")
];
db.collection.find({ _id: { $in: ids } });

Lưu ý quan trọng

  • Thứ tự kết quả không đảm bảo theo thứ tự mảng $in
  • Cần sắp xếp lại ở application layer nếu thứ tự quan trọng
  • Giới hạn kích thước mảng $in: ~16MB (kích thước document tối đa)
  • Với danh sách ID rất lớn, cân nhắc dùng $lookup từ collection tạm

Mẹo: Giữ nguyên thứ tự với aggregation

db.collection.aggregate([
    { $match: { _id: { $in: ids } } },
    { $addFields: { __sortOrder: { $indexOfArray: [ ids, "$_id" ] } } },
    { $sort: { __sortOrder: 1 } },
    { $project: { __sortOrder: 0 } }
]);