研究员;
有没有人能好心地给我解释一下这件困扰了我几天的事情?这应该是件简单的事情,但我似乎找不到问题出在哪里......
我需要根据今天的日期从集合中检索一年的记录,简单地说,如果今天是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调用提供答案。*
1条答案
按热度按时间nxagd54h1#
您需要使用
$expr
和$gte aggregation operator(不要误认为$gte Query Operator)。在MongoDB5.0和更新版本中,您还可以使用日期表达式操作符,如$dateSubtract