Подтвердить что ты не робот

Как сделать запрос "НЕ IN" в Монго?

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

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

Каков запрос на поиск всех документов, у которых нет пользователя 11 в "заблокированном"?

4b9b3361

Ответ 1

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

Пример...

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

Здесь я приведу несколько примеров: http://learnmongo.com/posts/being-part-of-the-in-crowd/

Ответ 2

Поскольку вы сравниваете одно значение, ваш пример фактически не требует операции 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]}});

Ответ 3

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

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

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

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

Ответ 4

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

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

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