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

उन दस्तावेज़ों को खोजें जहाँ एक फ़ील्ड एक सरणी में दूसरे के साथ तुलना करता है

आप अभी भी एग्रीगेट () का उपयोग कर सकते हैं यहां MongoDB 3.2 के साथ, लेकिन केवल $redact इसके बजाय:

db.boards.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$and": [
          { "$ne": [ "$createdBy._id", "$owner._id" ] },
          { "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

या $where के साथ MongoDB 3.2 शेल के लिए, आपको बस इस . की एक स्कोप्ड कॉपी रखनी होगी , और आपका सिंटैक्स थोड़ा हटकर था:

db.boards.find({
  "$where": function() {
    var self = this;
    return (this.createdBy._id != this.owner._id)
      && this.acl.some(function(e) {
        return e.profile._id === self.createdBy._id
     })
  }
})

या फिर ES6 संगत वातावरण में:

db.boards.find({
  "$where": function() {
    return (this.createdBy._id != this.owner._id)
      && this.acl.some(e => e.profile._id === this.createdBy._id)
  }
})

समुच्चय दोनों में से सबसे अधिक प्रदर्शन करने वाला विकल्प है और हमेशा जावास्क्रिप्ट मूल्यांकन का उपयोग करने के लिए बेहतर होना चाहिए

और इसके लायक क्या है, $expr<के साथ नया सिंटैक्स /कोड> होगा:

db.boards.find({
  "$expr": {
    "$and": [
      { "$ne": [ "$createdBy._id", "$owner._id" ] },
      { "$in": [ "$createdBy._id", "$acl.profile._id"] }
    ]
  }
})

$in का इस्तेमाल करना वरीयता में $setIsSubset जहां वाक्य रचना थोड़ा छोटा है।

    return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
      && this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB में एक ही फ़ील्ड के लिए एकाधिक दस्तावेज़ों के लिए शर्त लागू करना

  2. मोंगो फील्ड ए फील्ड बी से बड़ा है

  3. अजगर के माध्यम से उपयोगकर्ता को मोंगोडब में जोड़ें

  4. जांचें कि फ़ील्ड MongoDB के साथ मौजूद है

  5. अगर मौजूद नहीं है तो नेवला कई ऑब्जेक्ट को सरणी में जोड़ता है