2012-03-20 15 views
64

Próbuję wyświetlić zapytanie w MongoDB gdzie pole tekstowe nie jest „” (pusty)MongoDB nie równa

{ 'name' : { $not : '' }} 

Jednakże pojawia się błąd invalid use of $not

Szukałem ponad dokumentacja, ale przykłady, których używają, dotyczą skomplikowanych przypadków (z regexp i $not negującymi innego operatora).

Jak mogę zrobić prostą rzecz, którą próbuję zrobić?

Odpowiedz

97

Zastosowanie $ne - $not powinny być przestrzegane przez standardowe operatora:

An Przykłady $ ne, co oznacza nie równa:

use test 
switched to db test 
db.test.insert({author : 'me', post: ""}) 
db.test.insert({author : 'you', post: "how to query"}) 
db.test.find({'post': {$ne : ""}}) 
{ "_id" : ObjectId("4f68b1a7768972d396fe2268"), "author" : "you", "post" : "how to query" } 

A teraz $ nie, które odbywa się w orzecznika ($ ne) i neguje go ($ nie):

db.test.find({'post': {$not: {$ne : ""}}}) 
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" } 
+2

dla tych ciekawy '$ ne' odnosi się do„nie równa ". – abraham

+1

Ta odpowiedź ma dużą liczbę głosów, ale wyjaśnienie jest bardzo niejasne. Co dzieje się w przykładzie, który ma wartości $ not i $ ne? – GaTechThomas

+0

@GaTechThomas poprawił się nieco, czy wciąż jest niejasny? –

44

Jeśli chcesz zrobić stwardnienie $ne następnie zrobić

db.users.find({name : {$nin : ["mary", "dick", "jane"]}}) 
-1

przykład prawdziwego życia; znaleźć wszystkie, ale nie bieżącego użytkownika:

var players = Players.find({ my_x: player.my_x, my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
2

Z Mongo docs:

Operator $not dotyczy tylko innych operatorów i nie może sprawdzić pól i dokumentów niezależnie. Tak więc użyj operatora $not dla rozłączeń logicznych i operatora $ne, aby bezpośrednio przetestować zawartość pól .

Ponieważ testujesz pole bezpośrednio, to jest to właściwy operator, którego można użyć tutaj.

Edit:

Sytuacja, w której chcesz użyć $not jest:

db.inventory.find({ price: { $not: { $gt: 1.99 } } }) 

To by wybrać wszystkie dokumenty, w których:

  • Cena wartość pola jest mniejsza niż lub równe 1.99 lub cena
  • Pole nie istnieje
0

Jeśli istnieje null w tablicy i chcesz uniknąć go:

db.test.find({"contain" : {$ne :[] }}).pretty()