MongoDB:查找数组中具有 2 个值且符合多个条件的文档

rok*_*rok 4 arrays mongodb mongodb-query

假设我们有文档:

{_id : 1, arr : [5,50]}
{_id : 2, arr : [11,53]}
Run Code Online (Sandbox Code Playgroud)

目标是找到数组中具有 2 个值的文档,其中一个必须在范围 (4,9) 内,第二个必须在范围 (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}}]}}) 
Run Code Online (Sandbox Code Playgroud)

返回:错误:{“$err”:“无效运算符:$and”,“代码”:10068}

Joh*_*yHK 5

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

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

如果您还想确保这是唯一的两个元素,那么您可以向$and数组添加另一个项来检查:

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