Я думаю, у вас есть порядок ваших "аргументов" до $nin
в обратном направлении.Ваш запрос эквивалентен чему-то вроде этого в оболочке mongo:
db.users.update({_id: ObjectId("..."), ObjectId("..."): {$nin: ["user_groups"]}}, ...);
, которая читается как английский, слева направо, когда произносится "$nin
" как "not in".Более правильно, согласно грамматике MongoDB, произношение «не содержит», поэтому ваш запрос фактически говорит что-то вроде «где какой-то ObjectId не содержит этот массив», что не имеет большого смысла, когда произносится вслух.
Имея это в виду, ваш запрос должен выглядеть следующим образом:
db.users.update({_id: ObjectId("..."), user_groups: {$nin: [ObjectId("...")]}}, ...);
При возникновении подобных проблем с обновлениями или удалениями часто бывает полезно попробовать часть спецификации запроса в качестве аргумента для find()
или findOne()
чтобы определить, что там не так.Как только вы сможете найти документ, который хотите обновить, вы можете переписать его как update()
, remove()
и т. Д.
Кроме того, вы должны знать, что существует $addToSet
атомныйоператор, который выполняет такую проверку для вас атомарно в базе данных.Вы можете попробовать:
db.users.update({_id: ObjectId("...")}, {$addToSet: {user_groups: ObjectId("...")}});
РЕДАКТИРОВАТЬ: Для будущих ссылок на OP и другие запрашивающие, см. документы mongodb по операторам запросов и документы mongodb при обновленииоператоры .