使用 $avg mongodb 插入新字段
Posted
技术标签:
【中文标题】使用 $avg mongodb 插入新字段【英文标题】:inserting new field with $avg mongodb 【发布时间】:2021-03-11 21:13:23 【问题描述】:每次用户从 1 到 5 对某个帖子进行评分时,都会写入该数字(作为属性值),并将 userId 作为属性名称。
"starRatingByUser" :
"iZxSjCduTjfCQbmf9" : 3,
"LvBr6a427ofuvXFMp" : 4,
"gfhfhfh98rtgfXFft" : 5
是否可以在每次用户添加或更新评分时插入(更新)具有所有评分平均值的新字段(“starRatingAverage”)?
例子:
"starRatingAverage": 4,
"starRatingByUser" :
"iZxSjCduTjfCQbmf9" : 3,
"LvBr6a427ofuvXFMp" : 4,
"gfhfhfh98rtgfXFft" : 5
我有这个方法:
Recipes.update(
_id: recipeId ,
$set: ["starRatingByUser." + this.userId]: star
)
[示例图片] :https://i.stack.imgur.com/CuWbR.png
【问题讨论】:
这个非常不清楚,请更新 抱歉,更新了 【参考方案1】:在 mongodb 中有一个使用聚合更新的选项。 Update-documents-with-aggregation-pipeline
以下更新查询设置为两个参数。一是找文档,二是做聚合聚合中
将对象转化为数组,使用$objectToArray
计算总数
使用$size
获取数组的大小并使用$reduce
计算总数
$project
删除不需要的字段
脚本是
db.colelction.updateOne(
_id:1,
[
$addFields:
stu:
"$objectToArray": "$starRatingByUser"
,
$addFields:
size:
$size: "$stu"
,
total:
$reduce:
input: "$stu",
initialValue: 0,
in:
$add: [
"$$this.v",
"$$value"
]
,
"$project":
starRatingByAverage:
"$divide": [
"$total",
"$size"
]
,
starRatingByUser: 1
])
此查询已检查并且工作正常
【讨论】:
以上是关于使用 $avg mongodb 插入新字段的主要内容,如果未能解决你的问题,请参考以下文章