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

किसी दिए गए क्रम में दिखाई देने वाले दस्तावेज़ों की एक सरणी में दो तत्व ढूँढना

यदि आप क्वेरी में उस प्रकार की बाधा चाहते हैं, तो आपके पास मूल रूप से दो विकल्प हैं जो आपके MongoDB संस्करण का समर्थन करता है:

मोंगोडीबी 3.6

बेहतर होगा कि आप $expr का इस्तेमाल करें। "इसके अलावा" किसी भी सामान्य क्वेरी शर्तों के लिए वास्तव में वैध दस्तावेज़ों का चयन करने के लिए:

var A = 10, B = 40;

Model.find({
  "subDocs.value": { "$all": [A, B] },
  "$expr": {
    "$lt": [
      { "$arrayElemAt": [
        "$subDocs.index",
        { "$indexOfArray": [ "$subDocs.value", A ]}
      ]},
      { "$arrayElemAt": [
        "$subDocs.index",
        { "$indexOfArray": [ "$subDocs.value", B ]}  
      ]}
    ]
  }
})

या "पिछली" . से मेल खाते हुए घटना:

Model.find({
  "subDocs.value": { "$all": [A, B] },
  "$expr": {
    "$lt": [
      { "$arrayElemAt": [
        "$subDocs.index",
        { "$subtract": [
          { "$subtract": [{ "$size": "$subDocs.value" }, 1 ] },
          { "$indexOfArray": [ { "$reverseArray": "$subDocs.value" }, A ] }
        ]}
      ]},
      { "$arrayElemAt": [
        "$subDocs.index",
        { "$subtract": [
          { "$subtract": [{ "$size": "$subDocs.value" }, 1 ] },
          { "$indexOfArray": [ { "$reverseArray": "$subDocs.value" }, B ] }
        ]}
      ]}
    ]
  }
})

पहले के संस्करण

वही बात, लेकिन देशी ऑपरेटरों के बिना आपको <के जावास्क्रिप्ट मूल्यांकन का उपयोग करने की आवश्यकता है कोड>$कहां :

var A = 10, B = 40;

Model.find({
  "subDocs.value": { "$all": [A, B] },
  "$where": `this.subDocs.find( e => e.value === ${A}).index
      < this.subDocs.find( e => e.value === ${B}).index`
})

या "पिछली" . से मेल खाते हुए घटना:

Model.find({
  "subDocs.value": { "$all": [10,40] },
  "$where": `let arr = this.subDocs.reverse();
      return arr.find( e => e.value === ${A}).index
        > arr.find( e => e.value === ${B}).index`
})

अगर आपको एग्रीगेशन पाइपलाइन में इसकी ज़रूरत है, तो आप का इस्तेमाल करेंगे $redact और इसके बजाय पहले उदाहरण के समान तर्क:

var A = 10, B = 40;

Model.aggregate([
  { "$match": { "subDocs.value": { "$all": [A, B] } } },
  { "$redact": {
    "$cond": {
      "if": {
        "$lt": [
          { "$arrayElemAt": [
            "$subDocs.index",
            { "$indexOfArray": [ "$subDocs.value", A ]}
          ]},
          { "$arrayElemAt": [
            "$subDocs.index",
            { "$indexOfArray": [ "$subDocs.value", B ]}  
          ]}
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

यह कहने के लिए पर्याप्त है कि "तुलना तर्क" वास्तव में "क्वेरी ऑपरेटर अभिव्यक्तियों" के मूल निवासी नहीं है, इसलिए केवल एक ही हिस्सा है जो "इष्टतम" एक इंडेक्स पर लागू किया जा सकता है $all कोड> सभी मामलों में क्वेरी ऑपरेटर। आवश्यक शेष तर्क वास्तव में "के बाद" लागू होता है कि मुख्य अभिव्यक्ति का मूल्यांकन किया जाता है और "इसके अतिरिक्त" क्रम में कोई परिणाम नहीं लौटाया जाता है, जो कि अभिव्यक्ति को पूरा करने वाले $expr या $where

प्रत्येक का मूल तर्क अनिवार्य रूप से "index" . का मान निकालना है "पहले" सरणी सदस्य की संपत्ति जो वास्तव में "value" . में संबंधित मान से मेल खाती है संपत्ति। जहां यह "से कम" है, तो शर्त true है और यह लौटाए जा रहे दस्तावेज़ को संतुष्ट करता है।

तो ध्यान दें कि या तो "गणना मूल्यांकन" क्वेरी ऑपरेटरों की दक्षता से मेल खाता है, और अन्य क्वेरी ऑपरेटर स्थितियों के "संयोजन में" का उपयोग किए बिना जो "इंडेक्स" तक पहुंचने में सक्षम हैं, फिर एक "पूर्ण संग्रह स्कैन" शुरू किया जाएगा।

लेकिन समग्र परिणाम निश्चित रूप से सभी मिलान करने वाली वस्तुओं को पहली क्वेरी स्थिति में वापस करने और फिर डेटाबेस से लौटने के बाद कर्सर पर उन्हें अस्वीकार करने से अधिक कुशल है।

$arrayElemAt के लिए दस्तावेज़ भी देखें , $indexOfArray , $lt और Array.find() जावास्क्रिप्ट के लिए




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. टॉमकैट के साथ मोंगोडीबी जावा ड्राइवर डेटाबेस कनेक्शन पूलिंग

  2. MongoDB सरणी संपत्ति द्वारा फ़िल्टर केवल तभी मौजूद है

  3. mongoimport के साथ MongoDB में CSV फ़ाइल आयात करें

  4. OAuth 2.0 - रीफ्रेश टोकन के साथ एक्सेस टोकन का नवीनीकरण कब किया जाना चाहिए?

  5. मोंगोडीबी इंडेक्स और $या ऑपरेटर