एकत्रीकरण ढांचे के बावजूद MongoDB 3.6 और नए का उपयोग करते हुए काफी संभव है। $objectToArray
का उपयोग करें दस्तावेज़ को एक सरणी में बदलने के लिए एक एकत्रीकरण पाइपलाइन के भीतर ऑपरेटर। वापसी सरणी में मूल दस्तावेज़ में प्रत्येक फ़ील्ड/मान जोड़ी के लिए एक तत्व होता है। रिटर्न ऐरे में प्रत्येक तत्व एक दस्तावेज़ है जिसमें दो फ़ील्ड होते हैं k
और v
.
दस्तावेज़ को रूट करने का संदर्भ $$ROOT
. के माध्यम से संभव बनाया गया है सिस्टम वैरिएबल जो वर्तमान में एग्रीगेशन पाइपलाइन चरण में संसाधित किए जा रहे शीर्ष-स्तरीय दस्तावेज़ का संदर्भ देता है।
सरणी प्राप्त करने पर, आप $addFields
. के उपयोग का लाभ उठा सकते हैं एक फ़ील्ड बनाने के लिए पाइपलाइन चरण जो मायने रखता है और वास्तविक गणना $size
के उपयोग से प्राप्त की जाती है ऑपरेटर।
यह सब एक ही पाइपलाइन में निम्नलिखित भावों को नेस्ट करके किया जा सकता है:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
उदाहरण आउटपुट
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
_id
को बाहर करने के लिए फ़ील्ड, आप $filter
. का उपयोग कर सकते हैं ऑपरेटर के रूप में:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
या 0zkr PM द्वारा सुझाए गए अनुसार बस एक $project
जोड़ें शुरुआत में पाइपलाइन चरण:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])