根据另一个集合Mongodb上的字段对文档进行分组



我有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集合上使用聚合管道来获得所需的结果。

  1. $lookup阶段开始,为answers集合中的每个文档获取测验标签
  2. 使用$unwind阶段为每个测验文档返回一个输出文档
  3. 引入一个$group阶段,用relatedUserquiz.tags字段对文档进行分组,并用$sum计算result的和
  4. 添加另一个$lookup阶段以从users集合中获取用户文档
  5. 使用另一个$unwind阶段为每个用户文档返回一个输出文档
  6. $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

最新更新