我正在创建一个mongo聚合查询,它在我的$match块中使用$subtract运算符。如下代码所述。
此查询不起作用:
db.coll.aggregate(
[
{
$match: {
timestamp: {
$gte: {
$subtract: [new Date(), 24 * 60 * 60 * 1000]
}
}
}
},
{
$group: {
_id: {
timestamp: "$timestamp"
},
total: {
$sum: 1
}
}
},
{
$project: {
_id: 0,
timestamp: "$_id.timestamp",
total: "$total",
}
},
{
$sort: {
timestamp: -1
}
}
]
)
但是,第二个查询工作:
db.coll.aggregate(
[
{
$match: {
timestamp: {
$gte: new Date(new Date() - 24 * 60 * 60 * 1000)
}
}
},
{
$group: {
_id: {
timestamp: "$timestamp"
},
total: {
$sum: 1
}
}
},
{
$project: {
_id: 0,
timestamp: "$_id.timestamp",
total: "$total",
}
},
{
$sort: {
timestamp: -1
}
}
]
)
我需要在我的
$subtract
块上使用$match
,所以我不能使用最后一个查询。 最佳答案
$subtract
运算符是投影运算符。它仅在$project
步骤中可用。所以你的选择是:
(不推荐)在$match步骤之前添加一个$project步骤,以转换所有文档的timestamp
字段以执行以下匹配步骤。我不建议您这样做,因为此操作需要在数据库中的每个文档上执行,并防止数据库在时间戳字段上使用索引,因此可能会导致性能损失。
(建议)在shell/应用程序中生成要与之匹配的日期。生成一个新的date()对象,将其存储在一个变量中,减去24小时,然后使用该变量执行第二次查询。