查找包含不包含特定值的数组的文档

时间:2014-10-21 07:40:59

标签: javascript node.js mongodb mongoose mongodb-query

我有以下型号:

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

我正在寻找一个查询,该查询检索不属于某个组的所有人(即,人员'组数组不包含指定组的id)。

我在考虑这样的事情,但我不确定它是否正确:

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

2 个答案:

答案 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']);

代码变得更清晰,可读性更强。