MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Znajdź dokumenty, w których pole porównuje się z innym w tablicy

Nadal możesz używać aggregate() tutaj z MongoDB 3.2, ale używając tylko $redact zamiast tego:

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

Lub za pomocą $where w przypadku powłoki MongoDB 3.2 wystarczy zachować kopię w zakresie tego , a twoja składnia była nieco niewłaściwa:

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

Lub w środowisku zgodnym z ES6:

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

Agregat jest najbardziej wydajną opcją z tych dwóch i zawsze powinien być preferowany niż używanie ewaluacji JavaScript

I co jest warte, nowsza składnia z $expr byłoby:

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

Korzystanie z $in zamiast $setIsSubset gdzie składnia jest nieco krótsza.

    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. grupa w mongo z wyłączeniem wartości zerowych

  2. jak zapisać wynik zapytania mongodb do zmiennej javascript?

  3. Jak używać kwerendy geoprzestrzennej w sterowniku MongoDB C# 2.1?

  4. Używanie SetFields ze sterownikiem MongoDB C# 2.0

  5. Zwracanie Mono<UpdateResult> z reaktywnym szablonem MongoDB