MongoDB не равно

102

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

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

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

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

Как мне сделать то простое, что я пытаюсь сделать?

Акшат
источник

Ответы:

147

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

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

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

А теперь $not, который принимает predicate ( $ne) и отменяет его ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }
ом Ном ном
источник
4
Для любопытных $neотносится к «не равным».
Авраам
1
Этот ответ получил большое количество голосов, но объяснение очень неясное. Что происходит в примере, в котором есть и $ not, и $ ne?
GaTechThomas
так и в коротких $not :{ $neсредствах $eq, это то , что вы пытаетесь сказать?
Ану
61

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

db.users.find({name : {$nin : ["mary", "dick", "jane"]}})
Мартин Конечны
источник
10

Из документов Mongo :

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

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

Редактировать:

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

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

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

  • Значение поля цены меньше или равно 1,99 или цене
  • Поле не существует
нильси
источник
3

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

db.test.find({"contain" : {$ne :[] }}).pretty()
user3806115
источник
2

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

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
Энди
источник