我必须与MongoDB一起工作,但是我对此不太满意。我必须收集一些文档并根据一个字段删除重复项。
这是文档的(非常非常)简化的结构:
{
'user': 'The User',
'report': {
'id' : 0
...
}
}
用户可以具有多个 报告,以及多个相同 报告(不是概念上的错误,只有简化的结构使它变得奇怪)。
报告仅与一个 用户相关。
我想通过删除所有重复的报告ID来检索一组Reports-User。这是一个示例:
# Datas
User | Report ID
--------|----------
User1 | AAAA
User1 | AAAA
User1 | BBBB
User2 | CCCC
User3 | DDDD
User3 | DDDD
# Excepted output where each line represents a document
User | Report ID
--------|----------
User1 | AAAA
User1 | BBBB
User2 | CCCC
User3 | DDDD
我真的对所有聚合器感到困惑。我该怎么办?
答案 0 :(得分:1)
在聚合管道中使用$group
运算符非常简单。
首先,我的示例数据:
[
{ 'user': 'User1', report: { id: 'AAAA' } },
{ 'user': 'User1', report: { id: 'BBBB' } },
{ 'user': 'User1', report: { id: 'AAAA' } },
{ 'user': 'User2', report: { id: 'CCCC' } },
{ 'user': 'User3', report: { id: 'DDDD' } },
{ 'user': 'User3', report: { id: 'DDDD' } }
]
要获得与您发布的相同的“预期格式”,可以执行以下查询:
db.reports.aggregate([
{
$group: {
_id: "$report.id",
user: {
$first: '$user'
}
}
},
{
$project: {
_id: 0,
User: '$user',
Report: '$_id'
}
}
])
此聚合管道的第一步按report.id
对集合中的所有项目进行分组。注意,点号引用了嵌入式文档中的一个字段。通过在mongo找到的具有该报告ID的第一个文档上选择user
字段的值,它也可以投影user
字段。您提到报告ID对用户而言是唯一的,因此不会造成任何问题。
此聚合管道中的第二步只是将字段重命名为您用于预期格式的名称。 $group
运算符将输出的_id
字段设置为您分组的字段(在本例中为report.id
)。 $project
命令使用该值设置Report
字段,并取消设置_id
。