sql >> Database teknologi >  >> NoSQL >> MongoDB

Find dokumenter, hvor et felt kan sammenlignes med et andet i et array

Du kan stadig bruge aggregate() her med MongoDB 3.2, men bruger bare $redact i stedet:

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

Eller med $where til MongoDB 3.2-skallen skal du bare beholde en kopi af denne , og din syntaks var en smule forkert:

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
     })
  }
})

Eller i et ES6-kompatibelt miljø så:

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

Samlet er den mest effektive mulighed af de to og bør altid være at foretrække frem for at bruge JavaScript-evaluering

Og for hvad det er værd, den nyere syntaks med $expr ville være:

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

Brug af $in frem for $setIsSubset hvor syntaksen er lidt kortere.

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



  1. Er der nogen fordele ved at bruge et brugerdefineret _id til dokumenter i MongoDB?

  2. finde i BSON dokumenter med MongoDB C++ driver

  3. Adgang til MongoDB fra AppEngine-appen

  4. Mongodb:deling af en database mellem to computere