「トラブル」の原因は、2番目の集計段階です-{ $unwind: "$address" }
。 _id: 4
のパーティのレコードを削除します (あなたが言うように、そのアドレス配列は空であるため)そしてパーティー_id: 1
のために2つのレコードを生成します および_id: 5
(それぞれに2つのアドレスがあるため)
-
アドレスのないパーティが削除されないようにするには、
preserveNullAndEmptyArrays
を設定する必要があります$unwind
のオプションtrue
へのステージ 。 -
異なるアドレスのパーティの重複を防ぐには、
$group
を追加する必要があります パイプラインへの集約ステージ。また、$project
を使用します$filter
を使用したステージ 出力から空のアドレスレコードを除外する演算子。
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] } }
}
}
}]);