MongoDB non è uguale a


102

Sto cercando di visualizzare una query in MongoDB in cui un campo di testo non è '' (vuoto)

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

Tuttavia ottengo l'errore invalid use of $not

Ho esaminato la documentazione ma gli esempi che usano sono per casi complicati (con regexp e $notnegazione di un altro operatore).

Come farei la semplice cosa che sto cercando di fare?

Risposte:


147

Usa $ne- $notdovrebbe essere seguito dall'operatore standard:

Un esempio per $ne, che sta per non uguale:

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

E ora $not, che accetta predicate ( $ne) e lo nega ( $not):

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

4
Per chi è curioso $nesi intende "non uguale".
Abramo

1
Questa risposta ha un gran numero di voti, ma la spiegazione è molto poco chiara. Cosa sta succedendo nell'esempio che ha sia $ not che $ ne?
GaTechThomas

quindi in breve $not :{ $nesignifica $eq, questo è quello che stavi cercando di dire?
Anu

61

Se vuoi fare più cose, $nefallo

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


10

Dai documenti Mongo :

L' $notoperatore ha effetto solo sugli altri operatori e non può controllare campi e documenti in modo indipendente. Quindi, usa l' $notoperatore per le disgiunzioni logiche e l' $neoperatore per testare direttamente il contenuto dei campi.

Dato che stai testando direttamente il campo $neè l'operatore giusto da usare qui.

Modificare:

Una situazione in cui vorresti usare $notè:

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

Ciò selezionerebbe tutti i documenti in cui:

  • Il valore del campo del prezzo è inferiore o uguale a 1,99 o al prezzo
  • Il campo non esiste

3

Se c'è un nullin un array e vuoi evitarlo:

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

1

Esempio di vita reale; trova tutto ma non l'utente corrente:

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.