आपकी 'समस्याओं' का कारण एकत्रीकरण का दूसरा चरण है - { $unwind: "$address" }
. यह _id: 4
. के साथ पार्टी का रिकॉर्ड हटा देता है (क्योंकि इसका पता सरणी खाली है, जैसा कि आप उल्लेख करते हैं) और पार्टियों के लिए दो रिकॉर्ड तैयार करता है _id: 1
और _id: 5
(क्योंकि उनमें से प्रत्येक के दो पते हैं)।
-
पतों के बिना पार्टियों को हटाने से रोकने के लिए आपको
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] } }
}
}
}]);