MongoDB-删除查询中的重复项

时间:2019-11-07 10:30:02

标签: mongodb mongodb-query

我必须与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

我真的对所有聚合器感到困惑。我该怎么办?

1 个答案:

答案 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