我有以下模型:
var PersonSchema = new Schema({
name: String,
groups: [
{type: Schema.Types.ObjectId, ref: 'Group'}
],
});
我正在寻找一个查询,该查询检索不属于某个组的所有人员(即人员的组数组不包含指定组的id)。
我在想这样的事情,但我不确定它是正确的:
People. find({组:{$nin:[组_id]})
您基本上尝试的内容没有问题,但这里唯一的澄清可能是一个常见的误解,即在查询数组时需要像$nin
或$in
这样的运算符。
您在这里真正需要做的还有与$ne
的基本不等式匹配:
Person.find({ "groups": { "$ne": group._id } })
“数组”运算符不是用于“数组目标”,而是用于提供条件的“列表”以方便的形式进行测试。
Person.find({ "groups": { "$nin": [oneId, twoId,threeId] } })
因此,只需对单个条件使用普通运算符,并将$in
和$nin
保存为您要针对单个值或列表测试多个条件的位置。所以情况正好相反。
如果您确实需要传递参数的“列表”,其中提供的列表中的“无”与数组的内容匹配,则使用$not
运算符和$all
运算符反转逻辑:
Person.find({ "groups": { "$not": { "$all": [oneId,twoId,threeId] } } })
这意味着数组中不存在提供的“列表”。
这是Mongoose v5.11中更好的方法:
Person.find({ occupation: /host/ }).where('groups').nin(['group1', 'group2']);
代码变得更清晰,更具易读性。