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

Mongodb $where zapytanie zawsze prawdziwe z nodejs

Po pierwsze, pamiętaj, że $where operator prawie nigdy nie powinien być używany z powodów wyjaśnionych tutaj (kredyt należy do @WiredPrairie).

Wracając do twojego problemu, podejście, które chciałbyś zastosować, nie zadziała nawet w powłoce mongodb (która wyraźnie zezwala na nagie funkcje js z $where operator). Kod javascript dostarczony do $where operator jest wykonywany na serwerze mongo i nie będzie miał dostępu do otaczającego środowiska ("powiązania kontekstowe").

> db.test.insert({a: 42})
> db.test.find({a: 42})
{ "_id" : ObjectId("5150433c73f604984a7dff91"), "a" : 42 }
> db.test.find({$where: function() { return this.a == 42 }}) // works
{ "_id" : ObjectId("5150433c73f604984a7dff91"), "a" : 42 }
> var local_var = 42
> db.test.find({$where: function() { return this.a == local_var }})
error: {
    "$err" : "error on invocation of $where function:\nJS Error: ReferenceError: local_var is not defined nofile_b:1",
    "code" : 10071
}

Ponadto wygląda na to, że natywny sterownik mongo node.js zachowuje się inaczej niż powłoka, ponieważ nie serializuje automatycznie funkcji js, którą podajesz w obiekcie zapytania, a zamiast tego prawdopodobnie całkowicie porzuca klauzulę. To da ci odpowiednik timetables.find({}) który zwróci wszystkie dokumenty z kolekcji.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kopiuj/klonuj bazę danych w MongoDB

  2. Limit rozmiaru pojedynczego dokumentu MongoDB wynosi 16 MB

  3. MongoDB $project:Zachowaj poprzednie pola potoku

  4. Białe znaki MongoDB

  5. Podzbiór tablicy w potoku struktury agregacji