10

我有一个集合名称 Alpha_Num,它具有以下结构。我试图找出哪个字母数字对将出现最大次数?

如果我们只使用下面的数据,对 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。问题:如何在上述条件下从数组“数字”中选择不同的值?

4

1 回答 1

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 在线课程之一中得到了答案。

于 2013-04-22T03:55:28.540 回答