ऐसा करने का सबसे "प्रदर्शनकारी" तरीका है $unwind
. को छोड़ देना कुल मिलाकर और बस $group
गिनती करने के लिए। अनिवार्य रूप से "फ़िल्टर" सरणियों को $size
. मिलता है परिणामों में से $sum
:
db.objects.aggregate([
{ "$match": {
"createddate": {
"$gte": ISODate("2015-08-30T00:00:00.000Z")
},
"activity.action": "test_action"
}},
{ "$group": {
"_id": null,
"count": {
"$sum": {
"$size": {
"$setDifference": [
{ "$map": {
"input": "$activity",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.action", "test_action" ] },
"$$el",
false
]
}
}},
[false]
]
}
}
}
}}
])
MongoDB की भावी रिलीज़ में $filter
होगा , जो इसे और अधिक सरल बनाता है:
db.objects.aggregate([
{ "$match": {
"createddate": {
"$gte": ISODate("2015-08-30T00:00:00.000Z")
},
"activity.action": "test_action"
}},
{ "$group": {
"_id": null,
"count": {
"$sum": {
"$size": {
"$filter": {
"input": "$activity",
"as": "el",
"cond": {
"$eq": [ "$$el.action", "test_action" ]
}
}
}
}
}
}}
])
$unwind
. का उपयोग करना दस्तावेज़ों को डी-सामान्यीकृत करने का कारण बनता है और प्रभावी रूप से प्रति सरणी प्रविष्टि की एक प्रति बनाता है। जहां संभव हो आपको अक्सर अत्यधिक लागत के कारण इससे बचना चाहिए। प्रति दस्तावेज़ सरणी प्रविष्टियों को फ़िल्टर करना और गिनना तुलनात्मक रूप से बहुत तेज़ है। जैसा कि एक साधारण $match
है और $group
कई चरणों की तुलना में पाइपलाइन।