您的查询的第一个问题是您的 $match 对象不是有效的 js 对象。您不能用这样的东西替换对象键。此外,$match 还有其他限制。
如mongodb match documentation中所述
$match 查询语法与读操作查询语法相同;即 $match 不接受原始聚合表达式。要在 $match 中包含聚合表达式,请使用 $expr 查询表达式:
{ $match: { $expr: { <aggregation expression> } } }
$ifNull 可以像这样在 $match 中使用;
{
$match: {
$expr: {
$gte: [
{$ifNull: ["$startDate", "$createdAt"]},
ISODate("2018-06-01 10:03:46.000Z")
]
}
}
}
您的查询的可能版本:##
只使用 $match:
{
$match: {
$expr: {
$and: [
{ $gte: [
{$ifNull: ["$startDate", "$createdAt"]},
ISODate("2018-06-01 10:03:46.000Z")
]},
{ $lte: [
{$ifNull: ["$startDate", "$createdAt"]},
ISODate("2018-06-29 10:03:46.000Z")
]}
]
}
}
}
或者,您可以使用$project 计算值并使用在后面的步骤中
注意:这会影响性能,因为 Mongo 在匹配数据时将无法使用索引。
{
$project: {
'computedStartDate' : {$ifNull: ["$startDate", "$createdAt"]}
}
},
{
$match: {
"computedStartDate":
{"$gte": ISODate("2018-06-01 10:03:46.000Z"), "$lte": ISODate("2018-06-29 10:03:46.000Z")
}
}
}