mongodb - 基于另一个集合 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
}
]
并且需要 Result 是
{
"tags": "tag1",
"relatedUser": "Mike",
"totalResult": 30
}
解决方案
您可以在集合上使用聚合管道answers
来获得所需的结果。
- 从一个阶段开始,为集合
$lookup
中的每个文档获取测验标签。answers
- 使用
$unwind
阶段为每个测验文档返回一个输出文档。 - 引入一个
$group
阶段来按relatedUser
和quiz.tags
字段对文档进行分组并计算result
using的总和$sum
。 - 添加另一个
$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',
},
},
])
推荐阅读
- python-3.x - 如何从最新的数据框更新旧数据框
- java - 是否有适当的算法来连接字符串,使得多个字符串只能以唯一的组合连接?
- c# - 在最新的 C# 版本中,是否有更简洁的方式来访问字典键?
- android - Untiy android插件类未找到异常
- c++ - 导出具有特定大小的 QChartView,与小部件大小无关
- javascript - 如何在删除项目之前添加确认按钮?
- java - 带有点和散列的矩阵中的模式
- listview - Xamarin Forms ListView 项目自定义外观
- search - Solr 嵌套文档 - 不同子类型的方面字段
- ruby-on-rails - 为什么 class_eval 以不同的方式评估字符串和块?