Årsagen til dine 'problemer' er det andet aggregeringstrin - { $unwind: "$address" }
. Det fjerner post for part med _id: 4
(fordi dens adressearray er tom, som du nævner) og producerer to poster for parterne _id: 1
og _id: 5
(fordi hver af dem har to adresser).
-
For at forhindre fjernelse af parter uden adresser bør du indstille
preserveNullAndEmptyArrays
mulighed for$unwind
trin tiltrue
. -
For at forhindre duplikering af parter for deres forskellige adresser bør du tilføje
$group
aggregeringsstadiet til din pipeline. Brug også$project
trin med$filter
operatør for at udelukke tomme adresseposter i output.
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] } }
}
}
}]);