我有以下型号:
var PersonSchema = new Schema({
name: String,
groups: [
{type: Schema.Types.ObjectId, ref: 'Group'}
],
});
我正在寻找一个查询,该查询检索不属于某个组的所有人(即,人员'组数组不包含指定组的id)。
我在考虑这样的事情,但我不确定它是否正确:
Person.find({groups: {$nin: [group._id]})
答案 0 :(得分:23)
您基本上尝试的内容没有错,但也许唯一的澄清是在查询数组时需要$nin
或$in
等运算符的常见误解。
此外,您真正需要做的是与$ne
的基本不等式匹配:
Person.find({ "groups": { "$ne": group._id } })
“数组”运算符不是用于“数组目标”,而是用于提供条件的“列表”以便于测试。
Person.find({ "groups": { "$nin": [oneId, twoId,threeId] } })
因此,只需将常规运算符用于单个条件,并将$in
和$nin
保存到您希望针对单个值或列表测试多个条件的位置。所以它恰恰相反。
如果确实需要传递参数的“列表”,其中提供的列表中的那些“无”与数组的内容匹配,那么您可以使用$not
运算符和{{3}来反转逻辑运算符:
Person.find({ "groups": { "$not": { "$all": [oneId,twoId,threeId] } } })
这意味着数组中存在“所有列表”。
答案 1 :(得分:1)
这是在 Mongoose v5.11 中执行此操作的更好方法:
Person.find({ occupation: /host/ }).where('groups').nin(['group1', 'group2']);
代码变得更清晰,可读性更强。