Ответ 1
Вы можете использовать $в или $nin для "не в"
Пример...
> db.people.find({ crowd : { $nin: ["cool"] }});
Здесь я приведу несколько примеров: http://learnmongo.com/posts/being-part-of-the-in-crowd/
Это мой документ:
{
title:"Happy thanksgiving",
body: "come over for dinner",
blocked:[
{user:333, name:'john'},
{user:994, name:'jessica'},
{user:11, name: 'matt'},
]
}
Каков запрос на поиск всех документов, у которых нет пользователя 11 в "заблокированном"?
Вы можете использовать $в или $nin для "не в"
Пример...
> db.people.find({ crowd : { $nin: ["cool"] }});
Здесь я приведу несколько примеров: http://learnmongo.com/posts/being-part-of-the-in-crowd/
Поскольку вы сравниваете одно значение, ваш пример фактически не требует операции 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]}});
См. http://docs.mongodb.org/manual/reference/operator/query/nin/#op._S_nin
db.inventory.find( { qty: { $nin: [ 5, 15 ] } } )
Этот запрос будет выберите все документы в коллекции инвентаря, где поле qty значение не равно 5 и 15. Выбранные документы будут включать те документы, которые не содержат поля qty.
Если поле содержит массив, то оператор $nin выбирает документы, поле которых содержит массив без элемента, равного значению в указанном массиве (например, и т.д.).
Попробуйте следующее:
db.stack.find({"blocked.user":{$nin:[11]}})
Это сработало для меня.