MongoDB не дорівнює


102

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

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

Однак я отримую помилку invalid use of $not

Я переглянув документацію, але приклади, які вони використовують, є для складних випадків (з regexp та $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, який бере присудок ( $ne) і заперечує його ( $not):

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

4
Для тих, хто цікавиться, $neвідноситься до "не рівних".
abraham

1
Ця відповідь має велику кількість голосів, але пояснення дуже неясне. Що відбувається в прикладі, що має і $ не, і $ ne?
GaTechThomas

так і в коротких $not :{ $neзасобах $eq, це те , що ви намагаєтеся сказати?
Ану



10

З документів Монго :

$notОператор впливає тільки на інших операторів і не може перевірити поля і документи незалежно один від одного. Отже, використовуйте $notоператор для логічних диз'юнкцій, а $neоператор безпосередньо перевіряє вміст полів.

Оскільки ви безпосередньо тестуєте поле, $neце правильний оператор для використання тут.

Редагувати:

Ви хочете скористатися ситуацією $not:

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

Це вибрало б усі документи, де:

  • Вартість цінового поля менше або дорівнює 1,99 або ціни
  • Поля не існує

3

Якщо nullв масиві є і ви хочете його уникнути:

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

1

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

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.