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

如何使用MongoDB聚合查询计算数组长度差值找出得票最高对象

MongoDB 聚合查询实现最高得票对象查询

你可以直接使用以下聚合语句实现需求:

db.collection.aggregate([
  // 计算每个文档的最终得分
  {
    $addFields: {
      score: {
        $subtract: [
          { $size: "$upvotes" },
          { $size: "$downvotes" }
        ]
      }
    }
  },
  // 按得分降序排序,得分最高的排在最前
  {
    $sort: { score: -1 }
  },
  // 取第一条记录,即为得分最高的对象
  {
    $limit: 1
  },
  // 可选:不需要返回score字段时可以追加该阶段移除
  {
    $unset: "score"
  }
])

逻辑说明

  • $addFields阶段会为每个原始文档新增score字段,通过$size操作符分别获取upvotes和downvotes数组的长度,再用$subtract计算两者差值作为最终得分。
  • $sort阶段按照score字段降序排序,得分越高的文档排序越靠前。
  • $limit阶段只保留排序后的第一条结果,就是符合要求的得票最高的对象。

针对你给出的示例数据,该查询会返回name为A的文档,和预期结果一致。

多最高得分兼容处理

如果存在多个文档得分相同且都是最高分的场景,需要返回所有符合条件的文档,可以调整聚合语句为:

db.collection.aggregate([
  {
    $addFields: {
      score: {
        $subtract: [ { $size: "$upvotes" }, { $size: "$downvotes" } ]
      }
    }
  },
  {
    $group: {
      _id: "$score",
      topDocs: { $push: "$$ROOT" }
    }
  },
  {
    $sort: { _id: -1 }
  },
  {
    $limit: 1
  },
  {
    $replaceRoot: { newRoot: { topDocs: "$topDocs" } }
  }
])

内容的提问来源于stack exchange,提问作者thomasaar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:36:05