Arrays MongoDB:在符合多个条件的数组中查找具有2个值的文档
假设我们有文件:Arrays MongoDB:在符合多个条件的数组中查找具有2个值的文档,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,假设我们有文件: {_id : 1, arr : [5,50]} {_id : 2, arr : [11,53]} 目标是找到数组中有两个值的文档,一个值必须在范围(4,9)内,第二个值在范围(45,55)内。 在这种情况下,只应返回id为1的文档 我试过这个: db.Collection.find({arr:{$elemMatch:{$gte:4,$lte:9}}})-返回第一个文档 db.Collection.find({arr:{$elemMatch:{$gte:45,$lte:55}}
{_id : 1, arr : [5,50]}
{_id : 2, arr : [11,53]}
目标是找到数组中有两个值的文档,一个值必须在范围(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}}]}})
返回:错误:{“$err”:“无效运算符:$and”,“code”:10068}您的想法是正确的,但是
$和
需要位于条件对象的顶层:
db.Collection.find({$and:[
{arr:{$elemMatch:{$gte:4,$lte:9}},
{arr:{$elemMatch:{$gte:45,$lte:55}}
]})
如果您还想确保这是仅有的两个元素,则可以向$和数组中添加另一个术语以检查:
db.Collection.find({$and:[
{arr:{$elemMatch:{$gte:4,$lte:9}},
{arr:{$elemMatch:{$gte:45,$lte:55}},
{'arr.2':{$exists:false}
]})
要满足第一个要求“查找数组中有两个值的文档”,您可能需要将查询{arr:{$exists:true},$where:'this.arr.length=2'}
@chridam您不需要它,因为单个元素不能同时满足两个范围。如果有一个数组包含两个以上的元素,该怎么办?我不确定OP是否意味着任意的两个元素…@chridam说得好。我也不确定,但我更新了答案,加入了一个选项。