2013-04-10 65 views
10

我有一个集合名称Alpha_Num,它具有以下结构。我正试图找出哪个字母数字对会出现最大次数?从MongoDB中的数组中选择不同的值

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

回答

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在线课程中获得答案。