MongoDb एकत्रीकरण लुकअप पर, क्या विशेष फॉर्मेटिंग की आवश्यकता है?

Aug 18 2020

मैं असंबद्ध उपश्रेणियों के साथ MongoDB $ लुकअप का उपयोग करने की कोशिश कर रहा हूं।
MongoDB 3.6.12 का उपयोग करना (समर्थन 3.6 पर शुरू हुआ)https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries

निम्नलिखित पाइपलाइन कदम काम कर रहा है, हालांकि अगर मैं पहले "userB" को दूसरे के साथ स्वैप करता हूं, तो कोई परिणाम नहीं मिलता है।

{
from: 'friendships',
let: { requestuser: ObjectId("5c0a9c37b2365a002367df79"), postuser: ObjectId("5c0820ea17a69b00231627be") },
pipeline: [
   { 
        $match : { 
            $or : [ { "userA" : ObjectId("5c0820ea17a69b00231627be"), "userB" : ObjectId("5c0a9c37b2365a002367df79") // "userB" : '$$requestuser'
                }, 
                { 
                    "userA" : ObjectId("5c0a9c37b2365a002367df79"), 
                    "userB" : ObjectId("5c0820ea17a69b00231627be")
                }
            ], 
            "accepted" : true
        }
    },
    {
   $project: {v: 'true'}
    }
 ],
as: "match"}

हार्ड कोडित ऑब्जेक्ट के साथ परिणाम:

"match" : [
        {
            "_id" : ObjectId("5d6171dd319401001fd326bf"), 
            "v" : "true"
        }
    ]

चर का उपयोग करने वाले परिणाम:

"match" : [

    ]

मुझे ऐसा लगता है कि ऑब्जेक्ट्स को विशेष उपचार की आवश्यकता है। सभी उदाहरण जो मुझे मिल सकते हैं वे सरल चर जैसे स्ट्रिंग्स का उपयोग कर रहे हैं।

'$ $ RequestUser' को सत्यापित करने के लिए एक मूल्य निहित है, मैंने इसे प्रक्षेपण पर परीक्षण किया:

"match" : [
        {
            "_id" : ObjectId("5d6171dd319401001fd326bf"), 
            "v" : ObjectId("5c0a9c37b2365a002367df79")
        }
    ]

जवाब

2 varman Aug 18 2020 at 11:18

जब आप संयुक्त राष्ट्र की सह-संबंधित उप-पंक्ति का उपयोग करते हैं, तो आपको $exprएक चर पास करने के लिए उपयोग करने की आवश्यकता होती है । आप कुछ इस तरह की कोशिश कर सकते हैं।

{
    $match: {
      $expr: { $or: [
            { 
                $and:[ { $eq: [ "userA", ObjectId("5c0820ea17a69b00231627be") ]
                  },
                  {
                    $eq: [ "userB", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", "$$requestuser" ] } ] }, { $and:[
                  {
                    $eq: [ "userA", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", ObjectId("5c0820ea17a69b00231627be") ]
                  }
                ]
            }
          
          
        ]
      },
      "accepted": true,
      
    }
  }

मैंने यह दिखाने के लिए एक नमूना डेमो बनाया है कि $exprअंदर कैसे काम किया जाता है lookup: असंबंधित सबक्वेरी के लिए नमूना डेमो