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
$lookuptừ 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 } }
]);