MongoDB nie jest równe

102

Próbuję wyświetlić zapytanie w MongoDB, w którym pole tekstowe nie jest „” (puste)

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

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

Przejrzałem dokumentację, ale przykłady, których używają, dotyczą skomplikowanych przypadków (z wyrażeniem regularnym i $notnegacją innego operatora).

Jak miałbym zrobić prostą rzecz, którą próbuję zrobić?

Akszat
źródło

Odpowiedzi:

147

Użyj $ne- $notpowinien następować standardowy operator:

Przykłady $ne, co oznacza nierówne:

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 $not, który przyjmuje predykat ( $ne) i neguje go ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }
mniam mniam mniam
źródło
4
Dla ciekawskich $neoznacza „nierówne”.
Abraham
1
Ta odpowiedź ma dużą liczbę głosów, ale wyjaśnienie jest bardzo niejasne. Co się dzieje w przykładzie, w którym występuje zarówno symbol $ not, jak i $ ne?
GaTechThomas
Tak w skrócie $not :{ $neśrodki $eq, to co pan chce powiedzieć?
Anu,
61

Jeśli chcesz zrobić wiele, $nezrób

db.users.find({name : {$nin : ["mary", "dick", "jane"]}})
Martin Konecny
źródło
10

Z dokumentów Mongo :

$notOperator ma wpływ tylko na innych operatorów i nie może sprawdzić, pól i dokumentów niezależnie. Dlatego użyj $notoperatora do logicznych rozłączeń, a $neoperatora do bezpośredniego testowania zawartości pól.

Ponieważ testujesz pole bezpośrednio, $newłaściwym operatorem jest tutaj.

Edytować:

Sytuacja, w której chciałbyś skorzystać, $notto:

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

To spowoduje wybranie wszystkich dokumentów, w których:

  • Wartość pola ceny jest mniejsza lub równa 1,99 lub cena
  • Pole nie istnieje
nilsi
źródło
3

Jeśli nullw tablicy jest a i chcesz tego uniknąć:

db.test.find({"contain" : {$ne :[] }}).pretty()
user3806115
źródło
2

Przykład z życia; znajdź wszystkich oprócz bieżącego użytkownika:

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
Andy
źródło