MongoDB如何根据alreadyRead字段计算完成平均值并新增avgCompleted字段
MongoDB计算课程单元已读占比实现方案
以下两种方案可实现为每条文档新增avgCompleted已读占比字段的需求:
方案1:查询时动态返回字段(无需修改原有数据)
适合临时查询、不需要持久化存储字段的场景,使用聚合管道的$addFields阶段实时计算占比:
db.yourCollectionName.aggregate([ { $addFields: { avgCompleted: { $round: [ { $multiply: [ { $divide: [ { $sum: "$units.alreadyRead" }, { $size: "$units" } ] }, 100 ] } ] } } } ])
- 计算逻辑:
$sum: "$units.alreadyRead"累加所有已读单元数量,$size: "$units"获取单元总数量,两者相除后乘以100得到百分比,最后通过$round取整为整数,和你给出的示例输出完全匹配。 - 注意将代码中的
yourCollectionName替换为你实际使用的集合名称。
方案2:永久更新文档写入avgCompleted字段
如果需要将计算结果持久化保存到集合中,可使用updateMany配合聚合管道实现(要求MongoDB版本≥4.2):
db.yourCollectionName.updateMany( {}, // 此处可填写过滤条件,为空代表匹配所有文档 [ { $set: { avgCompleted: { $round: [ { $multiply: [ { $divide: [ { $sum: "$units.alreadyRead" }, { $size: "$units" } ] }, 100 ] } ] } } } ] )
执行后所有文档都会新增avgCompleted字段,后续更新units数组时可按需重新执行该语句更新字段值即可。
内容的提问来源于stack exchange,提问作者Smith Dwayne
相关产品推荐
相关产品推荐

