Tôi cũng gặp sự cố khi sử dụng $ lookup với mongoose để cố gắng đối sánh _id vì bộ sưu tập của tôi lưu trữ tham chiếu dưới dạng Chuỗi chứ không phải ObjectId
Mô hình A:{_id:ObjectId ("xxx"), b_id:"eeeee"}
Mô hình B:{_id:ObjectId ("eeeee")}
MyCollectionA.aggregate([
{
$lookup: {
from: "collectionb",
let: {id: "$b_id"},
pipeline: [{$match: {$expr: {$eq: ["$_id", "$$id"]}}}],
as: b
}
])
Trong ví dụ này, b không bao giờ được điền vì $$ id không được coi là ObjectId
Chỉ cần thêm một dự án để chuyển đổi $$ id trong objectId và nó đang hoạt động
MyCollectionA.aggregate([
{
$lookup: {
from: "collectionb",
let: {id: "$b_id"},
pipeline: [
{$project: {_id: 1, bid: {"$toObjectId": "$$id"}}},
{$match: {$expr: {$eq: ["$_id", "$bid"]}}}
],
as: b
}
])
Hoặc với ForeignField, localField:
MyCollectionA.aggregate([
{
$project:{
_id: 1,
b_id: {"$toObjectId": "$b_id"}
}
},
{
$lookup: {
from: "collectionb",
localField: "b_id",
foreignField: "_id",
as: b
}
])