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
比较日期的Mongodb shell聚合查询未返回结果_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

比较日期的Mongodb shell聚合查询未返回结果

比较日期的Mongodb shell聚合查询未返回结果,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我看不出这是什么问题。这不会有任何回报 db.mycoll.aggregate([ {$project:{CreatedAt:"$CreatedAt",Now:"$$NOW",DateFloor:{$add:["$$NOW",-24*60*60000]}}}, {$match:{CreatedAt:{$gte:"$DateFloor"}}} ]) 但这会返回结果——用实际值替换DateFloor db.mycoll.aggregate([ {$project:{CreatedAt:"$Crea

我看不出这是什么问题。这不会有任何回报

db.mycoll.aggregate([
{$project:{CreatedAt:"$CreatedAt",Now:"$$NOW",DateFloor:{$add:["$$NOW",-24*60*60000]}}},
{$match:{CreatedAt:{$gte:"$DateFloor"}}}
])
但这会返回结果——用实际值替换DateFloor

db.mycoll.aggregate([
{$project:{CreatedAt:"$CreatedAt",Now:"$$NOW",DateFloor:{$add:["$$NOW",-24*60*60000]}}},
{$match:{CreatedAt:{$gte: ISODate("2020-04-28T23:17:56.547Z")}}}
])

查询的问题是在执行以下操作时:

{$match:{CreatedAt:{$gte:"$DateFloor"}}}
实际上,您正在检查
CreatedAt
字段值大于输入字符串值的文档
“$DateFloor”
,因此
$match
没有将
“$DateFloor”
视为同一文档中的另一个字段,而是将其视为字符串值。因此,要比较同一文档中的两个字段,您需要使用
$gte
(这将允许您在查询语言中使用聚合表达式)


因此,当我说
聚合表达式
&为什么
$gte
需要包装在
$expr
中时,您可能会感到困惑-在您的实际查询中,MongoDB中指的是比较运算符,但在上面的查询中指的是聚合管道运算符,两者在技术上是相同的,但这是需要比较的同一文档中的两个字段。

要在
$match
中使用聚合表达式,您需要使用
$expr
@Pete\ch。如果查询未返回任何内容,则应使用聚合运算符。
{
  $match: {
    {
      $expr: {
        $gte: ["$CreatedAt", "$DateFloor"];
      }
    }
  }
}