我正在创建一个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小时,然后使用该变量执行第二次查询。

07-27 13:43