使用$ addToSet重复聚合

时间:2014-08-21 03:01:47

标签: mongodb aggregation-framework

我对MongoDB中的聚合框架还不熟悉,但根据我的理解,$addToSet功能只会向数组添加唯一值并忽略现有值。因此,由于某种原因,下面的聚合仍然会产生重复

db.tweets.aggregate([
{ 
    $group: { 
        _id: "$_id",
        hashtags: { 
            $addToSet : "$tweet.entities.hashtags.text" 
        }
    }
},
{ $unwind : "$hashtags" }
]);

原始Hashtags数组:

"hashtags" : [
                {
                    "indices" : [
                        64,
                        73
                    ],
                    "text" : "TONYTour"
                },
                {
                    "indices" : [
                        97,
                        101
                    ],
                    "text" : "NIU"
                },
                {
                    "indices" : [
                        102,
                        106
                    ],
                    "text" : "NIU"
                },
                {
                    "indices" : [
                        107,
                        111
                    ],
                    "text" : "NIU"
                }
            ]
        },

结果:

{
        "_id" : ObjectId("53f4aad7485aee023d000115"),
        "hashtags" : [
            "TONYTour",
            "NIU",
            "NIU",
            "NIU"
        ]
    }

我试图在放松后做第二组但没有成功。那么到底是什么我没有从聚合框架中抓住,为了达到我正在寻找的结果:

{
        "_id" : ObjectId("53f4aad7485aee023d000115"),
        "hashtags" : [
            "TONYTour",
            "NIU"
        ]
    }

1 个答案:

答案 0 :(得分:2)

我的猜测是你的问题是documentation

的这一部分
  

$ addToSet仅确保没有重复项添加到   设置并不会影响现有的重复元素。 $ addToSet   不保证修改集中元素的特定排序。

所以你的问题是,重复的hastags在同一个文档中。您可以先使用unwind来解决这个问题:

db.tweets.aggregate([
{ 

   { $unwind : "$tweet.entities.hashtags" },
    $group: { 
        _id: "$_id",
        hashtags: { 
            $addToSet : "$tweet.entities.hashtags.text" 
        }
    }
}
]);

这将为每个主题标签创建一个文档,然后$addToSet不应添加重复项

编辑:Neil Lunn的更正