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

किसी सरणी के अंतिम आइटम में मोंगोडब में कैसे खोजें?

मुझे पता है कि यह प्रश्न पुराना है, लेकिन एक इसी तरह के नए प्रश्न का उत्तर देने के बाद मैंने इसे Google पर पाया। . तो मैंने सोचा कि यह वही इलाज के लायक है।

आप $where के प्रदर्शन हिट से बच सकते हैं aggregate का इस्तेमाल करके इसके बजाय:

db.example.aggregate([

    // Use an index, which $where cannot to narrow down
    {$match: { "comments.by": "Abe" }},

    // De-normalize the Array
    {$unwind: "$comments"},

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

    // Match only where that $last comment by `by.Abe`
    {$match: { "comments.by": "Abe" }},

    // Retain the original _id order
    {$sort: { _id: 1 }}

])

और वह $कहां . के आसपास बजना चाहिए चूंकि हम के पास . के दस्तावेज़ों को सीमित करने में सक्षम थे पहली जगह में "अबे" द्वारा एक टिप्पणी। जैसा कि चेतावनी दी गई है, $कहां संग्रह में प्रत्येक दस्तावेज़ का परीक्षण करने जा रहा है और कभी भी किसी अनुक्रमणिका का उपयोग नहीं करेगा, भले ही कोई उपयोग करने के लिए हो।

बेशक, आप यहां वर्णित तकनीक का उपयोग करके भी मूल दस्तावेज़ को बनाए रख सकते हैं। साथ ही, इसलिए सब कुछ ठीक उसी तरह काम करेगा जैसे find()

इसे खोजने वाले किसी भी व्यक्ति के लिए केवल विचार के लिए भोजन।

आधुनिक MongoDB रिलीज़ के लिए अपडेट

आधुनिक रिलीज़ में $redact जोड़ा गया है पाइपलाइन अभिव्यक्ति और साथ ही $arrayElemAt (उत्तरार्द्ध 3.2 के रूप में, ताकि यहां न्यूनतम संस्करण होगा) जो संयोजन में एक तार्किक अभिव्यक्ति को $unwind मंच:

db.example.aggregate([
  { "$match": { "comments.by": "Abe" }},
  { "$redact": {
    "$cond": {
      "if": {
        "$eq": [
          { "$arrayElemAt": [ "$comments.by", -1 ] },
          "Abe"
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

यहां तर्क तुलना की गई है जहां $arrayElemAt सरणी की अंतिम अनुक्रमणिका प्राप्त हो रही है -1 , जो "by" . में मानों की केवल एक सरणी में रूपांतरित हो जाता है $map के ज़रिए प्रॉपर्टी . यह आवश्यक पैरामीटर, "Abe" . के विरुद्ध एकल मान की तुलना की अनुमति देता है ।

या $expr का उपयोग करके और भी आधुनिक MongoDB 3.6 और उच्चतर के लिए:

db.example.find({
  "comments.by": "Abe",
  "$expr": {
    "$eq": [
      { "$arrayElemAt": [ "$comments.by", -1 ] },
      "Abe"
    ]
  }
})

यह एक सरणी के भीतर अंतिम तत्व से मेल खाने के लिए अब तक का सबसे अधिक प्रदर्शन करने वाला समाधान होगा, और वास्तव में $where ज्यादातर मामलों में और विशेष रूप से यहाँ।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या मोंगोडब को राम में कुछ इंडेक्स स्टोर करने के लिए मजबूर करने का कोई तरीका है?

  2. मोंगो संग्रह में उप-दस्तावेज़ सरणी के पृष्ठांकित/कटा हुआ डेटा कैसे प्राप्त करें?

  3. जेसन स्ट्रिंग्स के साथ सी # मोंगो प्रश्न

  4. सरणी के भीतर स्थितियों के आधार पर सरणी से अलग मान प्राप्त करें

  5. मोंगोडीबी डिलीटऑन ()