Найти документы с массивом, который не содержит определенного значения

У меня есть следующая модель:

var PersonSchema = new Schema({
    name: String,
    groups: [
        {type: Schema.Types.ObjectId, ref: 'Group'}
    ],
});

Я ищу запрос, который извлекает все Лица, которые не являются частью определенной группы (т.е. массив групп лиц не содержит идентификатор указанной группы).

Я думал о чем-то подобном, но я не уверен, что это правильно:

Person.find({groups: {$nin: [group._id]})

Ответ 1

Ничего плохого в том, что вы в основном пытаетесь, но, возможно, единственное разъяснение здесь - распространенное заблуждение, что вам нужны операторы, такие как $nin или $in при запросе массива.

Также вам действительно нужно выполнить базовое неравенство с $ne:

Person.find({ "groups": { "$ne": group._id } })

Операторы "массива" не предназначены для "целей массива", а для предоставления "списка" условий для проверки в удобной форме.

Person.find({ "groups": { "$nin": [oneId, twoId,threeId] } })

Поэтому просто используйте обычные операторы для одиночных условий и сохраняйте $in и $nin для тех, где вы хотите протестировать более одного условия по отношению к одному значению или списку. Так что это просто наоборот.

Если вам нужно передать "список" аргументов, где "none" из тех, что указаны в представленном списке, соответствуют содержимому массива, тогда вы отменяете логику с помощью $not и оператор $all

Person.find({ "groups": { "$not": { "$all": [oneId,twoId,threeId] } } })

Таким образом, это означает, что в массиве присутствует "ни один из списка".