从MongoDB中的Array中选择Distinct值

时间:2013-04-10 02:37:35

标签: mongodb aggregation-framework

我有一个集合名称Alpha_Num,它具有以下结构。我想找出哪个Alphabet-Numerals对会出现最多次数?

如果我们只使用下面的数据,对abcd-123出现两次,因此对efgh-10001对,但第二个不是我的有效案例,因为它出现在同一文件中。

{
    "_id" : 12345,
    "Alphabet" : "abcd",
        "Numerals" : [
            "123",
            "456",
            "2345"
        ]
}
{
    "_id" : 123456,
    "Alphabet" : "efgh",
    "Numerals" : [
            "10001",
            "10001",
            "1002"
        ]
}

{
    "_id" : 123456567,
    "Alphabet" : "abcd",
        "Numerals" : [
            "123"
        ]
}

我尝试使用聚合框架工作,如下所示

db.Alpha_Num.aggregate([
                     {"$unwind":"$Numerals"},
                     {"$group":
                              {"_id":{"Alpha":"$Alphabet","Num":"$Numerals"},
                               "count":{$sum:1}}
                     },
                     {"$sort":{"count":-1}}
                     ])

此查询中的问题是它给两次efgh-10001对。 问题:如何在上述条件中从数组“数字”中选择不同的值?

1 个答案:

答案 0 :(得分:23)

问题解决了。

db.Alpha_Num.aggregate([{
     "$unwind": "$Numerals"
}, {
     "$group": {
             _id: {
                     "_id": "$_id",
                     "Alpha": "$Alphabet"
             },
             Num: {
                     $addToSet: "$Numerals"
             }
     }
}, {
     "$unwind": "$Num"
}, {
     "$group": {
             _id: {
                     "Alplha": "$_id.Alpha",
                     "Num": "$Num"
             },
             count: {
                     "$sum": 1
             }
     }
}])

使用$ addToSet进行分组并再次展开就可以了。得到了10gen在线课程的答案。