2012-03-20 1 views
64

Я пытаюсь отобразить запрос в MongoDB, где текстовое поле не «» (пробел)MongoDB не равна

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

Однако я получаю ошибку invalid use of $not

Я просмотрел документация, но примеры, которые они используют, предназначены для сложных случаев (с regexp и $not, отрицающих другого оператора).

Как бы я сделал простую вещь, которую я пытаюсь сделать?

ответ

97

Использование $ne - $not должны следовать стандартным оператором:

An примеры для $ пе, что означает не равны:

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

А теперь $ не, который принимает в предикате ($ п) и сводит на нет его ($ нет):

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

Для тех, кому интересно '$ ne' относится к«не равно ». – abraham

+1

Этот ответ имеет большое количество голосов, но объяснение очень неясно. Что происходит в примере, который имеет как $ not, так и $ ne? – GaTechThomas

+0

@GaTechThomas немного улучшилось, неужели все еще неясно? –

44

Если вы хотите сделать несколько $ne затем сделать

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

Реальный жизненный пример; найти все, но не текущего пользователя:

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

Из Mongo docs:

$not Оператор влияет только на других операторов и не могут проверить поля и документы независимо друг от друга. Таким образом, используйте оператор $not для логических разъединений и оператора $ne для проверки содержимого полей .

Поскольку вы тестируете поле напрямую $ne - это правильный оператор, который можно использовать здесь.

Edit:

ситуация, в которой вы хотели бы использовать $not является:

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

Что бы выбрать все документы, где:

  • цена значение поля меньше или равно 1.99 или цена
  • поле не существует
0

Если в массиве null, и вы хотите, чтобы избежать этого:

db.test.find({"contain" : {$ne :[] }}).pretty() 
Смежные вопросы