此问题在此处已有答案:
MongoDB comparison operators with null(1个答案)
昨天就关门了。
我有以下形式的项目集合:
{
# random fields here
events: [
...
{
# random fields here...
last_update_submitted: some date
}
]
}
字符串
我正在尝试查询集合,以寻找 events 数组中最后一个事件的 last_update_submitted 日期超过30天前的所有文件。到目前为止,我已经撰写这个汇总查询:
[
{
$project: {
events: "$events",
last_event: {
$last: "$events",
},
thirty_days_ago: {
$dateSubtract: {
startDate: new ISODate(),
unit: "day",
amount: 30
}
}
},
},
{
$match: {
$expr: {
$lt: [
"$last_event.last_update_submitted",
"$thirty_days_ago"
],
},
},
},
]
型
问题是,查询不仅返回具有与条件匹配的最后事件的文档,而且返回具有完全不包含 last_update_submitted 字段的最后事件的文档。因此,在我的示例中,如果 last_update_submitted 日期大于30天前,则正确地返回该日期。如果该日期小于30天前,但即使最后一个事件根本不包含 last_update_submitted 字段,它也会被返回。
这是预期的行为吗?如果是,建议的处理方法是什么?我应该先检查字段是否存在吗?
1条答案
按热度按时间3mpgtkmj1#
这里有一个解决方案,它突出了
$ifNull
的功能,并使用$let
设置变量,以便评估只发生一次。字符串