आप सही रास्ते पर लग रहे थे, false
. के उन मानों को हटाने के लिए बस अलग-अलग तरीके हैं सशर्त से। आप इसे कुछ भी वापस नहीं कर सकते हैं, लेकिन आप उन मूल्यों से छुटकारा पा सकते हैं जो आप नहीं चाहते हैं।
यदि आप वास्तव में "सेट" चाहते हैं और आपके पास MongoDB 2.6 या अधिक उपलब्ध है, तो आप मूल रूप से false
को फ़िल्टर कर सकते हैं $setDifference
का इस्तेमाल करने वाले मान
:
db.entities.aggregate([
{ "$unwind": "$entities" },
{ "$group": {
"_id": "$_id",
"A": {
"$addToSet": {
"$cond": [
{ "$eq": [ "$entities.type", "A" ] },
"$entities.val",
false
]
}
},
"B": {
"$addToSet": {
"$cond": [
{ "$eq": [ "$entities.type", "B" ] },
"$entities.val",
false
]
}
}
}},
{ "$project": {
"A": {
"$setDifference": [ "$A", [false] ]
},
"B": {
"$setDifference": [ "$B", [false] ]
}
}}
])
या केवल एक कदम के रूप में $map<का उपयोग करके /कोड>
$project
के अंदर ऑपरेटर
:
db.entities.aggregate([
{"$project": {
"A": {
"$setDifference": [
{
"$map": {
"input": "$entities",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.type", "A" ] },
"$$el.val",
false
]
}
}
},
[false]
]
},
"B": {
"$setDifference": [
{
"$map": {
"input": "$entities",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.type", "B" ] },
"$$el.val",
false
]
}
}
},
[false]
]
}
}}
])
या अन्यथा सामान्य $unwind
और $match
इन्हें फ़िल्टर करने के लिए ऑपरेटर:
db.entities.aggregate([
{ "$unwind": "$entities" },
{ "$group": {
"_id": "$_id",
"A": {
"$push": {
"$cond": [
{ "$eq": [ "$entities.type", "A" ] },
"$entities.val",
false
]
}
},
"B": {
"$push": {
"$cond": [
{ "$eq": [ "$entities.type", "B" ] },
"$entities.val",
false
]
}
}
}},
{ "$unwind": "$A" },
{ "$match": { "A": { "$ne": false } } },
{ "$group": {
"_id": "$_id",
"A": { "$push": "$A" },
"B": { "$first": "$B" }
}},
{ "$unwind": "$B" },
{ "$match": { "B": { "$ne": false } } },
{ "$group": {
"_id": "$_id",
"A": { "$first": "$A" },
"B": { "$push": "$B" }
}}
])
या तो $push
का उपयोग करना
सामान्य सरणियों के लिए या $addToSet
अद्वितीय सेट के लिए।