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
- 映射到模块
- 并在每个视频上添加一个字段,其中包含视频的平均进度
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
- 放松
- 替换根使结构更好
- 添加平均字段
aggregate(
[{"$unwind": {"path": "$modules"}},
{"$replaceRoot": {"newRoot": "$modules"}},
{"$set":
{"module_progress":
{"$avg":
{"$map":
{"input": "$videos.progress",
"in": {"$cond": [{"$eq": ["$$this", 100]}, "$$this", 0]}}}}}}])
我有这个集合结构:
[
"_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
- 映射到模块
- 并在每个视频上添加一个字段,其中包含视频的平均进度
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
- 放松
- 替换根使结构更好
- 添加平均字段
aggregate(
[{"$unwind": {"path": "$modules"}},
{"$replaceRoot": {"newRoot": "$modules"}},
{"$set":
{"module_progress":
{"$avg":
{"$map":
{"input": "$videos.progress",
"in": {"$cond": [{"$eq": ["$$this", 100]}, "$$this", 0]}}}}}}])