使用 $avg mongodb 插入新字段
inserting new field with $avg mongodb
每次用户对某些 post 从 1 到 5 进行评分时,该数字将被写入(作为 属性 值),用户 ID 为 属性 名称。
"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
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
}
}
])
这个查询已经过检查并且工作正常
每次用户对某些 post 从 1 到 5 进行评分时,该数字将被写入(作为 属性 值),用户 ID 为 属性 名称。
"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
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
}
}
])
这个查询已经过检查并且工作正常