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

सरणी का अंतिम तत्व प्राप्त करने के लिए $slice ऑपरेटर का उपयोग करना

जैसा कि आप अब तक जानते होंगे, $slice का उपयोग केवल परिणामों में लौटाए गए सरणी तत्वों को सीमित करने के लिए प्रोजेक्शन में किया जाता है। तो आप खोज() से परिणामों के साथ प्रोग्रामेटिक रूप से सूची को संसाधित करने के साथ फंस जाएंगे।

समुच्चय का उपयोग करना एक बेहतर तरीका है। लेकिन पहले आइए देखें कि कैसे $slice प्रयोग किया जाता है:

> db.collection.find({},{ relevancy: {$slice: -1} })
{ "_id" : ObjectId("530824b95f44eac1068b45c0"), "relevancy" : [  "Y" ] }
{ "_id" : ObjectId("530824b95f44eac1068b45c2"), "relevancy" : [  "Y" ] }
{ "_id" : ObjectId("530824b95f44eac1068b45c3"), "relevancy" : [  "N" ] }
{ "_id" : ObjectId("530824b95f44eac1068b45c4"), "relevancy" : [  "Y" ] }
{ "_id" : ObjectId("530824b95f44eac1068b45c6"), "relevancy" : [  "N" ] }
{ "_id" : ObjectId("530824b95f44eac1068b45c7"), "relevancy" : [  "N" ] }
{ "_id" : ObjectId("530824b95f44eac1068b45c8"), "relevancy" : [  "N" ] }

तो आपको अंतिम सरणी तत्व मिलता है, लेकिन आप परिणामों को लूप करने के साथ फंस गए हैं क्योंकि आप मिलान नहीं कर सकते हैं अंतिम तत्व मूल्य। आपने इसे कोड में भी किया होगा।

अब आइए समुच्चय को देखें :

db.collection.aggregate([
    // Match things so we get rid of the documents that will never match, but it will
    // still keep some of course since they are arrays, that *may* contain "N"
    { "$match": { "relevancy": "Y" } },

    // De-normalizes the array
    { "$unwind": "$relevancy" },

    // The order of the array is retained, so just look for the $last by _id
    { "$group": { "_id": "$_id", "relevancy": { "$last": "$relevancy" } }},

    // Match only the records with the results you want
    { "$match": { "relevancy": "Y" }},

    // Oh, and maintain the original _id order [ funny thing about $last ]
    { "$sort": { "_id": 1 } }
])

यहां तक ​​​​कि अगर यह कुल () का आपका पहला उपयोग होगा, तो मैं आपको इसे सीखने . के लिए प्रोत्साहित करता हूं . यह शायद आपकी सबसे उपयोगी समस्या समाधान उपकरण है। निश्चित रूप से मेरे लिए रहा है। प्रत्येक चरण को एक बार . में डालें ऐसे समय में जब आप सीख रहे हों।

अपने दस्तावेज़ फ़ॉर्म पर भी सुनिश्चित नहीं हैं, सभी 1: { ... } उप-दस्तावेज़ संकेतन एक गलती प्रतीत होती है लेकिन आपको इसे साफ़ करना चाहिए या ऊपर दिए गए कोड को "1.relevancy" के संदर्भ में समायोजित करना चाहिए बजाय। मुझे आशा है कि आपके दस्तावेज़ वास्तव में कुछ इस तरह दिखाई देंगे:

{ "relevancy" : [  "Y" ] , "_id" : ObjectId("530824b95f44eac1068b45c0") }
{ "relevancy" : [  "Y",  "Y" ] , "_id" : ObjectId("530824b95f44eac1068b45c2") }
{ "relevancy" : [  "N" ], "_id" : ObjectId("530824b95f44eac1068b45c3") }
{ "relevancy" : [  "Y",  "Y" ], "_id" : ObjectId("530824b95f44eac1068b45c4") }
{ "relevancy" : [  "Y",  "N" ], "_id" : ObjectId("530824b95f44eac1068b45c6") }
{ "relevancy" : [  "N" ], "_id" : ObjectId("530824b95f44eac1068b45c7") }
{ "relevancy" : [  "Y",  "N" ], "_id" : ObjectId("530824b95f44eac1068b45c8") }

MongoDB 3.2.x और ऊपर की ओर

बेशक MongoDB 3.2 $slice . के लिए एक "एग्रीगेशन" ऑपरेटर पेश करता है और इससे भी बेहतर $arrayElemAt ऑपरेटर जो किसी भी $unwind . की आवश्यकता को हटा देता है और $group प्रसंस्करण। शुरुआती $match . के बाद क्वेरी आप बस $redact . के साथ एक "तार्किक मिलान" बनाते हैं :

db.collection.aggregate([
    { "$match": { "relevancy": "Y" } },
    { "$redact": {
        "$cond": {
            "if": { "$eq": [{ "$arrayElemAt": [ "$relevancy", -1 ], "Y" ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}   
])

यह तय करते समय कि क्या $$KEEP करना है, यह सरणी के अंतिम तत्व पर निरीक्षण करने जा रहा है या $$PRUNE लौटाए गए परिणामों से दस्तावेज़।

यदि आप अभी भी "प्रक्षेपण" चाहते हैं तो आप वास्तव में $slice . जोड़ सकते हैं :

db.collection.aggregate([
    { "$match": { "relevancy": "Y" } },
    { "$redact": {
        "$cond": {
            "if": { "$eq": [{ "$arrayElemAt": [ "$relevancy", -1 ], "Y" ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }},
    { "$project": { "relevancy": { "$slice": [ "$relevancy", -1 ] } } }
])

या इसका वैकल्पिक तरीका:

db.collection.aggregate([
    { "$match": { "relevancy": "Y" } },
    { "$project": { "relevancy": { "$slice": [ "$relevancy", -1 ] } } },
    { "$match": { "relevancy": "Y" } }
])

लेकिन $redact . करना शायद कम खर्चीला है पहले और "फिर" `$प्रोजेक्ट' में कोई री-शेपिंग करें।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. फ्लास्क - खराब अनुरोध ब्राउज़र (या प्रॉक्सी) ने एक अनुरोध भेजा जिसे यह सर्वर समझ नहीं सका

  2. डेटाबेस अपडेट और सुरक्षा पैच को आसानी से कैसे प्रबंधित करें

  3. मोंगोडीबी $dateToString

  4. मोंगोडीबी $मैक्स

  5. नेस्टेड स्ट्रक्चर्स को एमजीओ के साथ स्टोर करना