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提供了如此详细的解释。这正是我没有得到的。