आप $cond
एक $प्रोजेक्ट
. में ऑपरेटर खाली attr
. को बदलने का चरण सरणी जिसमें एक प्लेसहोल्डर होता है जैसे null
जिसका उपयोग मार्कर के रूप में यह इंगित करने के लिए किया जा सकता है कि इस दस्तावेज़ में कोई attr
नहीं है तत्व।
तो आप एक अतिरिक्त $project
डालेंगे $अनविंड
. से ठीक पहले इस तरह का चरण :
{
$project: {
attrs: {$cond: {
if: {$eq: ['$attrs', [] ]},
then: [null],
else: '$attrs'
}}
}
},
केवल चेतावनी यह है कि आप एक शून्य
. के साथ समाप्त होंगे अंतिम attrs
में मान उन समूहों के लिए सरणी जिनमें कम से कम एक दस्तावेज़ बिना किसी attrs
. है तत्वों, इसलिए आपको उन क्लाइंट-साइड को अनदेखा करने की आवश्यकता है।
उदाहरण
उदाहरण एक परिवर्तित $मिलान
. का उपयोग करता है मंच क्योंकि आपके उदाहरण में से एक मान्य नहीं है।
इनपुट डॉक्स
[
{_id: {type: 1, id: 2}, attrs: []},
{_id: {type: 2, id: 1}, attrs: []},
{_id: {type: 2, id: 2}, attrs: [{name: 'john', type: 22}, {name: 'bob', type: 44}]}
]
आउटपुट
{
"result" : [
{
"_id" : 1,
"attrs" : [
null
]
},
{
"_id" : 2,
"attrs" : [
{
"name" : "bob",
"type" : 44
},
{
"name" : "john",
"type" : 22
},
null
]
}
],
"ok" : 1
}
एग्रीगेट कमांड
db.test.aggregate([
{
$match: {
'_id.servicePath': {
$in: [
null
]
}
}
},
{
$project: {
_id: 1,
"attrs.name": 1,
"attrs.type": 1
}
},
{
$project: {
attrs: {$cond: {
if: {$eq: ['$attrs', [] ]},
then: [null],
else: '$attrs'
}}
}
},
{
$unwind: "$attrs"
},
{
$group: {
_id: "$_id.type",
attrs: {
$addToSet: "$attrs"
}
}
},
{
$sort: {
_id: 1
}
}
])