क्या इसका मतलब यह है कि यदि आप $lookuppipeline में इनपुट चर का उपयोग कर रहे हैं तो आपको $expr
का उपयोग करना होगा
हाँ सही है, डिफ़ॉल्ट रूप से फ़िल्टर में अर्थात; .find()
. के फ़िल्टर भाग में या $match
. में एकत्रीकरण चरण आप दस्तावेज़ में किसी मौजूदा फ़ील्ड का उपयोग नहीं कर सकते हैं।
यदि आपको अपने क्वेरी फ़िल्टर में मौजूदा फ़ील्ड के मान का उपयोग करने की आवश्यकता है तो आपको एग्रीगेशन पाइपलाइन का उपयोग करने की आवश्यकता है, इसलिए .find()
में एग्रीगेशन पाइपलाइन का उपयोग करने के लिए या $match
. में आपको अपनी फ़िल्टर क्वेरी को $expr से लपेटने की आवश्यकता है। स्थानीय चरों तक पहुँचने का एक ही तरीका let
. का उपयोग करके बनाया गया है $lookup
. का $match
. में फ़िल्टर करें $expr
. द्वारा लपेटने की आवश्यकता है ।
आइए नीचे दिए गए उदाहरण पर विचार करें:
नमूना दस्तावेज़ :
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
प्रश्न:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
परीक्षा : मोंगोप्लेग्राउंड
यदि आप उपरोक्त क्वेरी देखते हैं तो दोनों इनपुट 1
और 4
क्वेरी में पास कर दिए जाते हैं, लेकिन यह आप नीचे दी गई क्वेरी की जांच करते हैं जहां आप key
. से मिलान करने का प्रयास करते हैं फ़ील्ड ==value
फ़ील्ड - यह काम नहीं करता :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
परीक्षा : मोंगोप्लेग्राउंड
ऊपर जैसा कि आप दो मौजूदा क्षेत्रों की तुलना कर रहे हैं तो आप ऐसा नहीं कर सकते क्योंकि इसका मतलब है कि आप key
वाले दस्तावेज़ों की जांच कर रहे हैं स्ट्रिंग के रूप में फ़ील्ड मान "$value"
. तो कहने के लिए कि यह एक स्ट्रिंग नहीं है, यह वास्तव में value
. का संदर्भ है फ़ील्ड आपको नीचे दिए गए $eq क्वेरी ऑपरेटर के बजाय $eq एग्रीगेशन ऑपरेटर का उपयोग करने की आवश्यकता है:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
परीक्षा : मोंगोप्लेग्राउंड