La cause de vos "problèmes" est la deuxième étape d'agrégation - { $unwind: "$address" }
. Il supprime l'enregistrement pour la partie avec _id: 4
(parce que son tableau d'adresses est vide, comme vous le mentionnez) et produit deux enregistrements pour les parties _id: 1
et _id: 5
(car chacun d'eux a deux adresses).
-
Pour empêcher la suppression des parties sans adresse, vous devez définir
preserveNullAndEmptyArrays
option de$unwind
passer àtrue
. -
Pour éviter la duplication des parties pour ses différentes adresses, vous devez ajouter
$group
étape d'agrégation à votre pipeline. Utilisez également$project
étape avec$filter
opérateur pour exclure les enregistrements d'adresse vides dans la sortie.
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] } }
}
}
}]);