You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:01:08