【问题标题】:inserting new field with $avg mongodb使用 $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

【问题讨论】:

  • 这个非常不清楚,请更新
  • 抱歉,更新了

标签: mongodb meteor average


【解决方案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
    }
  }
])

此查询已检查并且工作正常

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 2015-10-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多