Как сделать запрос «НЕ В» в Монго? - PullRequest
43 голосов
/ 18 июня 2011

Это мой документ:

{ 
    title:"Happy thanksgiving",
    body: "come over for dinner",
    blocked:[
       {user:333, name:'john'},
       {user:994, name:'jessica'},
       {user:11, name: 'matt'},
    ]
}

Каков запрос, чтобы найти все документы, которые не имеют пользователя 11 в «заблокированном»?

Ответы [ 4 ]

64 голосов
/ 18 июня 2011

Вы можете использовать $ in или $ nin для "not in"

Пример ...

> db.people.find({ crowd : { $nin: ["cool"] }});

Я положилВот еще несколько примеров: http://learnmongo.com/posts/being-part-of-the-in-crowd/

30 голосов
/ 07 января 2013

Поскольку вы сравниваете одно значение, ваш пример на самом деле не нуждается в операции NOT IN. Это потому, что Mongo будет применять свои критерии поиска к каждому элементу вложенного документа массива. Вы можете использовать оператор NOT EQUALS, $ ne, чтобы получить то, что вы хотите, так как оно принимает значение, которое не может появиться в поиске:

db.myCollection.find({'blocked.user': {$ne: 11}});

Однако, если у вас есть много вещей, которым оно не может сравниться, то тогда вы бы использовали оператор NOT IN, который равен $ nin. Он принимает массив значений, которые не могут быть найдены в поиске:

db.myCollection.find({'blocked.user': {$nin: [11, 12, 13]}});
2 голосов
/ 02 июня 2016

Попробуйте следующее:

db.stack.find({"blocked.user":{$nin:[11]}})

Это сработало для меня.

2 голосов
/ 18 июня 2011

См. http://docs.mongodb.org/manual/reference/operator/query/nin/#op._S_nin

db.inventory.find( { qty: { $nin: [ 5, 15 ] } } )

Этот запрос будет выбрать все документы в инвентаре, где поле кол-во значение не равно ни 5, ни 15. Выбранные документы будут включать те документы, которые не содержат поле qty.

Если поле содержит массив, оператор $ nin выбирает документы, в поле которых содержится массив без элемента, равного значению в указанном массиве (например, и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...