如何筛选MongoDB中满足分数差条件的24小时内最新文档
MongoDB 查询解决方案:筛选符合条件的文档
针对你的需求,我们可以通过MongoDB聚合管道实现目标查询,完整逻辑如下:
[ // 按id分组,收集每个id下的所有文档,按创建时间倒序后取前2个最新记录 { $group: { _id: "$id", docs: { $push: "$$ROOT" } } }, { $set: { docs: { $slice: [ { $sortArray: { input: "$docs", sortBy: { created_at: -1 } } }, 2 ] } } }, // 过滤掉文档数量不足2的分组(无法满足"两个最新文档"的条件) { $match: { $expr: { $gte: [{ $size: "$docs" }, 2] } } }, // 提取最新/次新文档的分数与创建时间,计算分数差值的绝对值 { $set: { latest_doc: { $first: "$docs" }, second_latest_doc: { $last: "$docs" }, score_diff: { $abs: { $subtract: [{ $first: "$docs.score" }, { $last: "$docs.score" }] } } } }, // 筛选满足条件的分组:最新文档在过去24小时内,且分数差值小于5 { $match: { $and: [ { $expr: { $gte: [ "$latest_doc.created_at", { $subtract: ["$$NOW", 86400000] } ] } }, { score_diff: { $lt: 5 } } ] } }, // 可选:如果需要输出原文档结构,添加以下步骤展开分组内的文档 { $unwind: "$docs" }, { $replaceRoot: { newRoot: "$docs" } } ]
关键逻辑说明:
- 分组取最新记录:通过
$group聚合同一id的所有文档,再用$sortArray按创建时间倒序排序,$slice截取前2条,确保拿到每个id下的两个最新文档。 - 过滤无效分组:排除文档数量不足2的分组,避免后续计算出现异常。
- 条件校验:计算两个最新文档的分数差值绝对值,同时检查最新文档的创建时间是否在过去24小时内(
$$NOW减去86400000毫秒即24小时)。 - 可选文档展开:若需要最终输出原始文档格式,通过
$unwind和$replaceRoot将分组内的文档还原为顶层结构。
内容的提问来源于stack exchange,提问作者John M.
相关产品推荐
相关产品推荐

