使用$$NOW的动态MongoDB聚合

k10s72fa  于 2023-02-21  发布在  Go
关注(0)|答案(1)|浏览(177)

研究员;
有没有人能好心地给我解释一下这件困扰了我几天的事情?这应该是件简单的事情,但我似乎找不到问题出在哪里......
我需要根据今天的日期从集合中检索一年的记录,简单地说,如果今天是2023-02-15,我需要在2022-02-15之后创建的记录。
当然,这是可行的:

[
  { 
    $match: { _created: { $gte: ISODate("2022-02-15") } }
  }
]

问题是,当试图创建一个不需要不断更新的聚合时,$$NOW似乎不起作用,我不明白为什么。
例如,这是行不通的:

[
  {
    $match:
    {
       _created:
       {
         $gte:
         { 
           $subtract: [ "$$NOW", { $multiply: [1000, 60, 60, 24, 365] } ]
         }
       }
    }
  }
]

这个也不对

[
  {
    $set: 
    { 
      startDate: { $subtract: [ "$$NOW", { $multiply: [1000, 60, 60, 24, 365] } ] }
    }
  },
  {
    $match:
    {
      _created: { $gte: ISODate("$startDate") }
    }
  }
]

我试过移动东西,解析$$NOW的结果只得到日期部分,把它转换成不同的类型......结果总是一样的:没有错误,但也没有筛选的记录。
我觉得答案可能是我忽略了的一些很愚蠢的事情。
有更有经验的人能伸出援助之手吗?

  • P.S.:在检索到所需的记录后,聚合继续进行,我只是不想列出发生了什么,因为问题只涉及记录的匹配。我们的Mongod版本是6.0.3,我正在MongoDB Compass上工作,想法是将此聚合保存为一个查询,为API调用提供答案。*
nxagd54h

nxagd54h1#

您需要使用$expr$gte aggregation operator(不要误认为$gte Query Operator)。在MongoDB5.0和更新版本中,您还可以使用日期表达式操作符,如$dateSubtract

{
    $match:
    {
       $expr:
       {
         $gte:
           [ "$_created", { $dateSubtract: { startDate: "$$NOW", unit: "year", amount: 1 } } ]
       }
    }
  }

相关问题