Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
Mongodb $expr查询运算符似乎不适用于数组点表示法_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb $expr查询运算符似乎不适用于数组点表示法

Mongodb $expr查询运算符似乎不适用于数组点表示法,mongodb,mongodb-query,Mongodb,Mongodb Query,我需要在集合中查找与两个日期之间的比较相匹配的文档,其中一个日期位于文档中的数组中 我发现了一个解决方案,它将$arrayElemAt与聚合管道结合使用,但对这个问题感到失望 我最初认为问题来自于我如何使用带有日期字段的$lte运营商,但我设法将问题缩小到一个更简单的可复制问题 db.getCollection('test-expr').insert({ "value1" : 1, "value2" : 1, "value

我需要在集合中查找与两个日期之间的比较相匹配的文档,其中一个日期位于文档中的数组中

我发现了一个解决方案,它将
$arrayElemAt
与聚合管道结合使用,但对这个问题感到失望

我最初认为问题来自于我如何使用带有日期字段的$lte运营商,但我设法将问题缩小到一个更简单的可复制问题

db.getCollection('test-expr').insert({
    "value1" : 1,
    "value2" : 1,
    "values" : [ 
        1
    ]
})
现在尝试查找包含$expr的文档:

db.getCollection('test-expr').find({$expr: {$eq: ["$value1", "$value2"]}})
=>返回我刚刚插入的文档

尝试使用点表示法比较数组的第一个元素:

db.getCollection('test-expr').find({$expr: {$eq: ["$value1", "$values.0"]}})
db.test.find({ $expr: { $eq: [ "$val.0", 99 ]  } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ]  } } )
=>不返回任何内容

我想可能点符号在$expr中不起作用,但我在MongoDB文档中找不到任何可以指出这一点的东西

如前所述,我已经找到了解决我的问题的方法,但我想了解为什么不能通过这种方式实现


我遗漏了什么吗?

$expr
仅允许使用聚合表达式运算符。您使用的点表示法无法访问字段
“值”:[1]
的数组元素。您需要使用
$arrayElemAt
操作符,它工作正常

您的代码
find({$expr:{$eq:[“$value1”,“$value2”]}})
工作正常,因为
$expr
使用了聚合表达式操作符,而不是MongoDB查询语言(MQL)操作符。请注意,这两个运算符看起来很相似,但用法和语法不同

而且,代码
find({$expr:{$eq:[“$value1”,“$values.0”]}})
无法正常工作-正如预期的那样。在聚合运算符
$values.0
中,
0
被解释为字段名,而不是数组字段的索引

我想也许点符号在$expr中不起作用,但我不能 在MongoDB文档中找到任何指出这一点的内容

点表示法在
$expr
中也能正常工作。下面是一个示例,带有示例文档:

{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
现在使用
$expr
和点符号:

db.getCollection('test-expr').find({$expr: {$eq: ["$value1", "$values.0"]}})
db.test.find({ $expr: { $eq: [ "$val.0", 99 ]  } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ]  } } )
这两个查询都返回文档-匹配使用
$expr
和点表示法的过滤器。但是,这仅适用于嵌入(或子)文档,而不适用于数组字段

形成文件,说明:

这些表达式运算符可用于构造 表达式 用于聚合管道阶段

:

表达式可以包括字段路径、文字、系统变量、, 表达式对象和表达式运算符。表达式可以是 嵌套的

字段路径

聚合表达式使用字段路径访问输入中的字段 文件。要指定字段路径,请在字段名或 虚线字段名(如果该字段位于嵌入文档中),带有 美元符号$。例如,“$user”来指定 用户字段或“$user.name”指定“user.name”的字段路径 场


阅读中的
$in:@DheemanthBhat感谢您的见解。事实上,我有多种解决这个问题的方法,但我想了解为什么不可能这样做。将编辑问题以强调这一点。这是否回答了您的问题?这实际上是同一个问题,谢谢,但它没有解释为什么点符号不起作用,尽管Mongo docs说不是这样。谢谢prasad提供了如此详细的解释。这正是我没有得到的。