【问题标题】:MongoDB : find documents having 2 values in Array conforming to multiple criteriaMongoDB:在符合多个条件的数组中查找具有 2 个值的文档
【发布时间】:2015-04-29 01:34:53
【问题描述】:

假设,我们有文件:

{_id : 1, arr : [5,50]}
{_id : 2, arr : [11,53]}

目标是找到在数组中有 2 个值的文档,一个必须在 range(4,9) 中,第二个在 range(45,55) 中。 在这种情况下,只有 _id : 1 的文档应该返回。

试过这个: db.Collection.find({arr : {$elemMatch : {$gte : 4, $lte : 9}}}) - 返回第一个文档 db.Collection.find({arr : {$elemMatch : {$gte : 45, $lte : 55}}}) - 两者都返回

如何将这些标准组合在一起?

db.Collection.find({arr : {$and : [{$elemMatch : {$gte : 4, $lte : 9}}, {$elemMatch : {$gte : 45, $lte : 55}}]}}) 

returns : error: { "$err" : "invalid operator: $and", "code" : 10068 }

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    您的想法是对的,但 $and 需要位于您的条件对象的顶层:

    db.Collection.find({$and: [
        {arr: {$elemMatch: {$gte: 4, $lte: 9}}},
        {arr: {$elemMatch: {$gte: 45, $lte: 55}}}
    ]})
    

    如果您还想确保这些是两个元素,那么您可以在$and 数组中添加另一个术语来检查:

    db.Collection.find({$and: [
        {arr: {$elemMatch: {$gte: 4, $lte: 9}}},
        {arr: {$elemMatch: {$gte: 45, $lte: 55}}},
        {'arr.2': {$exists: false}}
    ]})
    

    【讨论】:

    • 要满足第一个要求“查找在数组中有 2 个值的文档”,您可能需要输入查询 {arr : {$exists:true}, $where:'this.arr.length=2'}
    • @chridam 你不需要那个,因为单个元素不能满足两个范围。
    • 如果一个数组有两个以上的元素怎么办?我不确定 OP 是否意味着任意两个元素......
    • @chridam 好点。我也不确定,但我更新了答案以包含一个选项。
    猜你喜欢
    • 2019-12-03
    • 2018-04-21
    • 2020-07-25
    • 2014-08-12
    • 2019-10-11
    • 2019-07-16
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多