提问者:小点点

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


我有以下模型:

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

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

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

People. find({组:{$nin:[组_id]})


共2个答案

匿名用户

您基本上尝试的内容没有问题,但这里唯一的澄清可能是一个常见的误解,即在查询数组时需要像$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']);

代码变得更清晰,更具易读性。