यदि आप क्वेरी में उस प्रकार की बाधा चाहते हैं, तो आपके पास मूल रूप से दो विकल्प हैं जो आपके 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()
जावास्क्रिप्ट के लिए