Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MongoDB:在符合多个条件的数组中查找具有2个值的文档_Arrays_Mongodb_Mongodb Query - Fatal编程技术网

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说得好。我也不确定,但我更新了答案,加入了一个选项。