MongoDB 聚合以从嵌套数组中提取值,并且 return 总计

MongoDB aggregate to extract values from a nested array and return a total

我有这个集合结构:

[
   "_id": "61a013b59f9dd0ebfd23ftgb",
   "modules": [
     {
       "_id": "61a013b59f9dd0ebfd964dgh",
       "videos": [
         {
           "_id": "213412",
           "progress": 100
         },
         {
           "_id": "61a013b59f9dd0ebfd965f4a",
           "progress": 0
         },
       ]
     },
     {
       "_id": "43556hujferwdhgsdft",
       "videos": [
         {
           "_id": "fdsg3sg98er989890",
           "progress": 66
         },
         {
           "_id": "fdsg3sg98er989890",
           "progress": 100
         },
         {
           "_id": "fdsg3sg98er989890",
           "progress": 100
         }
       ]
     }
   ]
 ]

我正在尝试 return 每个“模块”的总体进度,方法是将所有进度为 100 的视频相加并根据模块中的视频数量创建百分比。例如,第一个模块应该 return "module_progess" 其中有 50 个,因为这已经完成了 1/2 个视频。

{
   "_id": "61a013b59f9dd0ebfd964dgh",
   "module_progress": 50,
   "videos": [
     {
       "_id": "213412",
       "progress": 100
     },
     {
       "_id": "61a013b59f9dd0ebfd965f4a",
       "progress": 0
     },
   ]
},

我如何访问每个视频对象以进行此计算并将新字段添加到响应中?

查询 1

  • 映射到模块
  • 并在每个视频上添加一个字段,其中包含视频的平均进度

Test code here

aggregate(
[{"$set": 
   {"modules": 
     {"$map": 
       {"input": "$modules",
        "in": 
        {"$mergeObjects": 
          ["$$this",
           {"module_progress": 
             {"$avg": 
               {"$map": 
                 {"input": "$$this.videos.progress",
                  "in": 
                  {"$cond": [{"$eq": ["$$progress", 100]}, "$$progress", 0]},
                  "as": "progress"}}}}]}}}}}])

查询2

  • 放松
  • 替换根使结构更好
  • 添加平均字段

Test code here

aggregate(
[{"$unwind": {"path": "$modules"}},
  {"$replaceRoot": {"newRoot": "$modules"}},
  {"$set": 
    {"module_progress": 
      {"$avg": 
        {"$map": 
          {"input": "$videos.progress",
            "in": {"$cond": [{"$eq": ["$$this", 100]}, "$$this", 0]}}}}}}])