我有3个集合
测验
[
{
"_id": 1,
"name": "quiz1",
"tags": "tag1",
},
{
"_id": 2,
"name": "quiz2",
"tags": "tag1"
}
]
用户
{
"_id": 1,
"name": "Mike"
}
答案
[
{
_id: 1,
"relatedUser": 1,
"relatedQuiz": 1,
"result": 10
},
{
_id: 1,
"relatedUser": 1,
"relatedQuiz": 2,
"result": 20
}
]
并且需要结果为
{
"tags": "tag1",
"relatedUser": "Mike",
"totalResult": 30
}
您可以在answers
集合上使用聚合管道来获得所需的结果。
- 从
$lookup
阶段开始,为answers
集合中的每个文档获取测验标签 - 使用
$unwind
阶段为每个测验文档返回一个输出文档 - 引入一个
$group
阶段,用relatedUser
和quiz.tags
字段对文档进行分组,并用$sum
计算result
的和 - 添加另一个
$lookup
阶段以从users
集合中获取用户文档 - 使用另一个
$unwind
阶段为每个用户文档返回一个输出文档 - 以
$project
阶段结束,返回您感兴趣的字段
db.answers.aggregate([
{
$lookup: {
from: 'quizzes',
localField: 'relatedQuiz',
foreignField: '_id',
as: 'quiz',
},
},
{
$unwind: '$quiz',
},
{
$group: {
_id: {
userId: '$relatedUser',
tags: '$quiz.tags',
},
score: {
$sum: '$result',
},
},
},
{
$lookup: {
from: 'users',
localField: '_id.userId',
foreignField: '_id',
as: 'user',
},
},
{
$unwind: '$user',
},
{
$project: {
_id: 0,
tags: '$_id.tags',
relatedUser: '$user.name',
totalResult: '$score',
},
},
])
MongoPlayground