A causa de seus 'problemas' é o segundo estágio de agregação -
{ $unwind: "$address" } . Ele remove o registro da parte com _id: 4 (porque sua matriz de endereços está vazia, como você mencionou) e produz dois registros para partes _id: 1 e _id: 5 (porque cada um deles tem dois endereços). -
Para evitar a remoção de partes sem endereços, você deve definirpreserveNullAndEmptyArraysopção de$unwindestágio paratrue.
-
Para evitar a duplicação de partes para seus diferentes endereços, você deve adicionar$groupestágio de agregação ao seu pipeline. Além disso, use$projectpalco com$filteroperador para excluir registros de endereço vazios na saída.
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] } }
}
}
}]);