Nguyên nhân gây ra 'rắc rối' của bạn là ở giai đoạn tổng hợp thứ hai - { $unwind: "$address" }
. Nó xóa bản ghi cho bên có _id: 4
(vì mảng địa chỉ của nó trống, như bạn đề cập) và tạo ra hai bản ghi cho các bên _id: 1
và _id: 5
(vì mỗi người trong số họ có hai địa chỉ).
-
Để ngăn chặn việc xóa các bên không có địa chỉ, bạn nên đặt
preserveNullAndEmptyArrays
tùy chọn của$unwind
chuyển thànhtrue
. -
Để ngăn việc sao chép các bên cho các địa chỉ khác nhau, bạn nên thêm
$group
giai đoạn tổng hợp vào đường dẫn của bạn. Ngoài ra, hãy sử dụng$project
giai đoạn với$filter
toán tử để loại trừ các bản ghi địa chỉ trống trong đầu ra.
db.party.aggregate([{
$lookup: {
from: "address",
localField: "_id",
foreignField: "party_id",
as: "address"
}
}, {
$unwind: {
path: "$address",
preserveNullAndEmptyArrays: true
}
}, {
$lookup: {
from: "addressComment",
localField: "address._id",
foreignField: "address_id",
as: "address.addressComment",
}
}, {
$group: {
_id : "$_id",
name: { $first: "$name" },
address: { $push: "$address" }
}
}, {
$project: {
_id: 1,
name: 1,
address: {
$filter: { input: "$address", as: "a", cond: { $ifNull: ["$$a._id", false] } }
}
}
}]);