La causa dei tuoi "problemi" è la seconda fase di aggregazione - { $unwind: "$address" }
. Rimuove il record per il party con _id: 4
(perché il suo array di indirizzi è vuoto, come dici tu) e produce due record per le parti _id: 1
e _id: 5
(perché ognuno di essi ha due indirizzi).
-
Per impedire la rimozione di parti senza indirizzo è necessario impostare
preserveNullAndEmptyArrays
opzione di$unwind
fase atrue
. -
Per evitare la duplicazione delle parti per i suoi diversi indirizzi dovresti aggiungere
$group
fase di aggregazione alla pipeline. Inoltre, usa$project
fase con$filter
operatore per escludere record di indirizzi vuoti nell'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] } }
}
}
}]);