使用 $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
    }
  }
])

这个查询已经过检查并且工作正常