如何使用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
相关产品推荐
相关产品推荐

