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

दो मानों के आधार पर तत्व खोजें

से (संभव) , $where का उपयोग कर समाधान अनुसरण करेंगे:

db.collection.find({
    "$where": function() {
        self = this;
        return this.actors.filter(function(actor) {
            return self.director._id === actor._id;
        }).length > 0
    }
})

और दूसरा सुझाया गया दृष्टिकोण जो एकत्रीकरण ढांचे का उपयोग करता है $redact पाइपलाइन:

db.collection.aggregate([
    { 
        "$redact": { 
            "$cond": [
                { 
                    "$setIsSubset": [ 
                        ["$director._id"], 
                        {
                            "$map": {
                                "input": "$actors",
                                "as": "el",
                                "in": "$$el._id"
                            }
                        }
                    ] 
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

उपरोक्त में, <के लिए कंडीशन लॉजिक कोड>$रिडक्ट सेट ऑपरेटरों के उपयोग के माध्यम से किया जाता है $setIsSubset और $map .

$map ऑपरेटर अभिनेताओं . से केवल अभिनेता आईडी के साथ एक सरणी लौटाएगा सरणी में प्रत्येक तत्व के लिए एक अभिव्यक्ति लागू करने के बाद सरणी। तो उदाहरण के लिए, व्यंजक

{
    "$map": {
        "input": "$actors",
        "as": "el",
        "in": "$$el._id"
    }
}

यदि अभिनेता सरणी पर लागू किया जाता है

[ 
    {
        "_id" : "artist:3",
        "first_name" : "James",
        "last_name" : "Stewart",
        "birth_date" : "1908",
        "role" : "John Ferguson"
    }, 
    {
        "_id" : "artist:16",
        "first_name" : "Kim",
        "last_name" : "Novak",
        "birth_date" : "1925",
        "role" : "Madeleine Elster"
    }, 
    {
        "_id" : "artist:282",
        "first_name" : "Arthur",
        "last_name" : "Pierre",
        "birth_date" : null,
        "role" : null
    }
]

वापस आ जाएगा

[ "artist:3", "artist:16", "artist:282" ]

इस परिणाम की तुलना एकल तत्व सरणी से की जाती है ["$directors._id"] $setIsSubset ऑपरेटर जो दो सरणियों को लेता है और सत्य लौटाता है जब पहली सरणी दूसरे का सबसेट होती है, जिसमें पहली सरणी दूसरी सरणी के बराबर होती है, और अन्यथा झूठी होती है।

उदाहरण के लिए,

{ 
    "$setIsSubset": [ 
        [ "artist:12" ], 
        [ "artist:3", "artist:16", "artist:282" ] 
    ] 
}       // false

{ 
    $setIsSubset: [ 
        [ "artist:282" ], 
        [ "artist:3", "artist:16", "artist:282" ] 
    ] 
}       // true

इसके बाद ऑपरेटर के बूलियन परिणाम को $redact पाइपलाइन।

प्रदर्शन के लिए स्पष्टीकरण अभी भी कायम है:$where आवश्यक होने पर एक अच्छा हैक है, लेकिन जब भी संभव हो इससे बचना चाहिए।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नोडजेएस का उपयोग करके ग्रिडएफएस में सहेजी गई फ़ाइल को कैसे डाउनलोड करें

  2. बाध्यकारी गतिशील सर्वर प्रतिक्रिया (नेस्टेड जेसन)

  3. एम जी ओ ड्राइवर के साथ मोंगो एकत्रीकरण क्वेरी

  4. नेवला, mongoDB में स्थिति के आधार पर आबाद करें

  5. MongoDB के साथ PouchDB का उपयोग करना