आप ऐसा नहीं कर सकते जैसा कि वास्तव में <के दस्तावेज़ीकरण में संदर्भित है। कोड>$आकार . ताकि ऑपरेटर अकेले "शाब्दिक" परिणाम का मूल्यांकन करे और नहीं जैसे आप पूछ रहे हैं "रेंज ऑपरेटरों" के साथ संयोजन में उपयोग करें।
आपका एकमात्र वास्तविक विकल्प यह है कि $नहीं
ऑपरेटर। जो पूरी तरह से मान्य है:
db.userStats.count({ "sessions": { "$not": { "$size": 0 } } });
या अन्यथा $size के अन्य अवतार के साथ परीक्षण करें
एकत्रीकरण ढांचे में, जब तक आपका MongoDB संस्करण 2.6 या उससे अधिक है:
db.userStats.aggregate([
{ "$group": {
"_id": null,
"count": {
"$sum": {
"$cond": [
{ "$gt": [ { "$size": "$sessions", 0 } ] },
1,
0
]
}
}
}}
])
संभवतः $where
के साथ भी
जावास्क्रिप्ट मूल्यांकन का रूप:
db.userStats.count(function() { return this.sessions.length > 0 });
लेकिन संभवतः पिछले संस्करण की तुलना में धीमी है।
या वास्तव में आप इसे केवल "dot notation"<के साथ कर सकते हैं। /ए> , और $exists
ऑपरेटर:
db.userStats.count({ "sesssions.0": { "$exists": true } });
जैसा कि सामान्य विचार यह है कि यदि सूचकांक में कोई तत्व है 0
तब सरणी की कुछ लंबाई होती है।
यह सब आपके दृष्टिकोण पर निर्भर करता है, लेकिन इनमें से किसी भी रूप का सही परिणाम मिलता है।
लेकिन MongoDB के "सर्वश्रेष्ठ" प्रदर्शन के लिए, किसी भी . का उपयोग न करें इन विधियों के। इसके बजाय, सरणी "लंबाई" को उस दस्तावेज़ की संपत्ति के रूप में रखें जिसका आप निरीक्षण कर रहे हैं। यह आप "इंडेक्स" कर सकते हैं और जारी किए गए प्रश्न वास्तव में उस इंडेक्स तक पहुंच सकते हैं, जो उपरोक्त में से कोई भी नहीं कर सकता है।
इसे इस तरह बनाए रखें:
db.userStats.update(
{ "_id": docId, "sessions": { "$ne": newItem } },
{
"$push": { "sessions": newItem },
"$inc": { "countSessions": 1 }
}
)
या हटाने के लिए:
db.userStats.update(
{ "_id": docId, "sessions": newItem },
{
"$pull": { "sessions": newItem },
"$inc": { "countSessions": -1 }
}
)
फिर आप केवल "countSesssions" पर क्वेरी कर सकते हैं जो सर्वश्रेष्ठ प्रदर्शन के लिए इंडेक्स भी कर सकता है:
db.userStats.find({ "countSessions": { "$gt": 0 } })
और यह करने का यह "सर्वश्रेष्ठ" तरीका है।