MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Намерете документи, където едно поле се сравнява с друго в масив

Все още можете да използвате aggregate() тук с 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 просто трябва да запазите копие с обхват на this , а синтаксисът ви беше малко неправилен:

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

Агрегатът е най-ефективният вариант от двата и винаги трябва да бъде за предпочитане пред използването на JavaScript оценка

И колкото си струва, по-новият синтаксис с $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 Community Edition 4.0 на Linux

  2. Принуди mongodb да извежда строг JSON

  3. Ефективност на групово вмъкване в MongoDB за големи колекции

  4. Как да настроите useMongoClient (Mongoose 4.11.0)?

  5. SQL COALESCE() Обяснено