使用 $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 插入新字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R 在 MongoDB 中批量插入文档?

如何使用Spring Data可伸缩地将元素插入MongoDB中的集合字段?

从 REST API 返回的图像总是显示损坏

如何在 MongoDB 缝合中插入文档并在字段上启用规则

MongoDB的增删改查

更新猫鼬模式后,新输入的字段未插入已创建的集合中