MongoDB - 使用聚合展开数组并删除重复项

l a*_*a s 40 mongodb

我正在使用MongoDB聚合框架展开一个数组,并且该数组有重复项,我需要在进行进一步分组时忽略这些重复项.

我怎样才能做到这一点?

Rom*_*kar 44

你可以使用$ addToSet来做到这一点:

db.users.aggregate([
  { $unwind: '$data' },
  { $group: { _id: '$_id', data: { $addToSet: '$data' } } }
]);
Run Code Online (Sandbox Code Playgroud)

如果没有看到您的实际查询,很难给出更具体的答案.

  • 你可以按id和数组元素进行分组(不添加设置),没有你的查询就不能多说 (2认同)

小智 25

你必须使用$ addToSet,但首先你必须按_id分组,因为如果你不这样做,你将在列表中的每个项目中获得一个元素.

想象一下集合帖子的文档如下:

{
     body: "Lorem Ipsum...", 
     tags: ["stuff", "lorem", "lorem"],
     author: "Enrique Coslado"
}
Run Code Online (Sandbox Code Playgroud)

想象一下,您想要计算每位作者最常用的标签.您可以像这样进行聚合查询:

db.posts.aggregate([
    {$project: {
        author: "$author", 
        tags: "$tags", 
        post_id: "$_id"
    }}, 

    {$unwind: "$tags"}, 

    {$group: {
        _id: "$post_id", 
        author: {$first: "$author"}, 
        tags: {$addToSet: "$tags"}
    }}, 

    {$unwind: "$tags"},

    {$group: {
        _id: {
            author: "$author",
            tags: "$tags"
        },
        count: {$sum: 1}
    }}
])
Run Code Online (Sandbox Code Playgroud)

这样你就会得到这样的文件:

{
     _id: {
         author: "Enrique Coslado", 
         tags: "lorem"
     },
     count: 1
}
Run Code Online (Sandbox Code Playgroud)