MongoDB diferente de

102

Estou tentando exibir uma consulta no MongoDB em que um campo de texto não é '' (em branco)

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

No entanto, recebo o erro invalid use of $not

Eu examinei a documentação, mas os exemplos que eles usam são para casos complicados (com regexp e $notnegando outro operador).

Como eu faria a coisa simples que estou tentando fazer?

Akshat
fonte

Respostas:

147

Uso $ne- $notdeve ser seguido pelo operador padrão:

Um exemplo para $ne, que significa não igual:

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 agora $not, que pega o predicado ( $ne) e o nega ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }
om-nom-nom
fonte
4
Para os curiosos $nerefere-se a "diferente".
abraham
1
Essa resposta tem um grande número de votos, mas a explicação é muito obscura. O que está acontecendo no exemplo que tem $ not e $ ne?
GaTechThomas
Assim, em breve $not :{ $nemeios $eq, isto é o que você estava tentando dizer?
Anu
61

Se você quiser fazer vários $ne, faça

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

Dos documentos do Mongo :

O $notoperador afeta apenas outros operadores e não pode verificar campos e documentos de forma independente. Portanto, use o $notoperador para disjunções lógicas e o $neoperador para testar o conteúdo dos campos diretamente.

Como você está testando o campo diretamente, $neé o operador certo a ser usado aqui.

Editar:

Uma situação em que você gostaria de usar $noté:

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

Isso selecionaria todos os documentos onde:

  • O valor do campo de preço é menor ou igual a 1,99 ou o preço
  • Campo não existe
Nilsi
fonte
3

Se houver um nullem uma matriz e você quiser evitá-lo:

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

Exemplo da vida real; localizar todos, exceto o usuário atual:

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