【问题标题】:Find documents with array that doesn't contains a specific value查找包含不包含特定值的数组的文档
【发布时间】:2014-12-16 08:39:30
【问题描述】:

我有以下型号:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    这意味着提供的“列表中的任何一个”都不存在于数组中。

    【讨论】:

    • 只是为了确定,您提出的查询不是要返回所有组数组中至少一个元素与 group._id 不同的 Persons 吗? (我需要组数组中的所有元素都不同)
    • @Marius 您只传递了一个元素,尽管为了运算符[group._id] 将其包装在一个数组中。如果您打算传递一个“列表”并确保列表中的这些项目都不存在,那么还有另一种表示方式。
    【解决方案2】:

    这是在 Mongoose v5.11 中执行此操作的更好方法:

    Person.find({ occupation: /host/ }).where('groups').nin(['group1', 'group2']);
    

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 2016-12-11
      • 2017-05-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多