MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

mongodb क्वेरी:$ आकार के साथ $gt हमेशा 0 देता है

आप ऐसा नहीं कर सकते जैसा कि वास्तव में <के दस्तावेज़ीकरण में संदर्भित है। कोड>$आकार . ताकि ऑपरेटर अकेले "शाब्दिक" परिणाम का मूल्यांकन करे और नहीं जैसे आप पूछ रहे हैं "रेंज ऑपरेटरों" के साथ संयोजन में उपयोग करें।

आपका एकमात्र वास्तविक विकल्प यह है कि $नहीं ऑपरेटर। जो पूरी तरह से मान्य है:

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 } })

और यह करने का यह "सर्वश्रेष्ठ" तरीका है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB के साथ उप-दस्तावेज़ में सरणी को कैसे फ़िल्टर करें?

  2. क्या पाइथन ऑब्जेक्ट्स को सीधे mongoDB में क्रमबद्ध किए बिना स्टोर करने का कोई तरीका है?

  3. Node.js MongoDB संदर्भ का पुन:उपयोग करता है

  4. विशिष्ट फ़ील्ड - mongoDB के आधार पर किसी सरणी में अद्वितीय आइटम कैसे सुनिश्चित करें?

  5. MongoDB अपडेट डीप ऐरे