यह वास्तव में पूरी तरह स्पष्ट नहीं है कि आपका विशिष्ट मामला उदाहरण के बिना क्या है। $ifNull
ऑपरेटर है जो "कुछ और" के साथ एक शून्य मान या अनुपलब्ध फ़ील्ड को "प्रतिस्थापित" कर सकता है, लेकिन वास्तव में "छोड़ना" संभव नहीं है।
यह कहा गया है कि, आप अपने वास्तविक उपयोग मामले के आधार पर परिणामों को हमेशा "फ़िल्टर" कर सकते हैं।
अपने परिणामी डेटा वास्तव में है, तो एक "सेट" और आप एक MongoDB संस्करण है 2.6 या अधिक से अधिक है तो आप $addToSet
से कुछ मदद के साथ $setDifference
उपयोग कर सकते हैं null
मानों की संख्या है कि शुरू में रखा जाता है कम करने के लिए:
db.collection.aggregate([
{ "$group": {
"_id": "$key",
"list": { "$addToSet": "$field" }
}},
{ "$project": {
"list": { "$setDifference": [ "$list", [null] ] }
}}
])
तो केवल null
होगा और फिर $setDifference
ऑपरेशन तुलना में "फिल्टर" करेगा।
पहले के संस्करणों में
या जब मूल्यों वास्तव में "अद्वितीय" नहीं हैं और नहीं एक "सेट", तो आप "फिल्टर" प्रसंस्करण द्वारा $unwind
और $match
साथ:
db.collection.aggregate([
{ "$group": {
"_id": "$key",
"list": { "$push": "$field" }
}},
{ "$unwind": "$list" },
{ "$match": { "list": { "$ne": null } }},
{ "$group": {
"_id": "$_id",
"list": { "$push": "$list" }
}}
])
आप नहीं करना चाहते हैं
db.collection.aggregate([
{ "$group": {
"_id": "$key",
"list": { "$push": "$field" },
"count": {
"$sum": {
"$cond": [
{ "$eq": { "$ifNull": [ "$field", null ] }, null },
0,
1
]
}
}
}},
{ "$unwind": "$list" },
{ "$match": {
"$or": [
{ "list": { "$ne": null } },
{ "count": 0 }
]
}},
{ "$group": {
"_id": "$_id",
"list": { "$push": "$list" }
}},
{ "$project": {
"list": {
"$cond": [
{ "$eq": [ "$count", 0 ] },
{ "$const": [] },
"$list"
]
}
}}
])
एक अंतिम $project
के साथ: सरणियों कि अंत होगा "खाली" क्योंकि वे निहित "कुछ भी नहीं लेकिन" null
की "विनाशकारी" होने के लिए, तो आप एक गिनती उपयोग $ifNull
और मैच की स्थिति पर रखने किसी भी सरणी को प्रतिस्थापित करना जिसमें केवल null
मान केवल रिक्त सरणी ऑब्जेक्ट के साथ होते हैं।
आपने मुझे अभी मस्तिष्क-मंदी से बचाया है! धन्यवाद – mhlavacka