2016-12-05 145 views
0

我正在建立最常用卡片組合的統計數據,這可以通過展開$玩家並使用$ players.spells.d的_id進行分組來輕鬆完成 - 它運行速度非常快,並且完全符合我的要求。與相同的數組元素總和的MongoDB聚合如何?

我的問題是我無法弄清楚如何考慮卡的級別。 (卡可以升級) - 當關卡丟失時,這意味着它是1級。所以我想最終得到的是卡組ID(所有卡的組合,它們已經被分類,所以不需要做任何魔術技巧,已經用下面的$ players.spells.d分組生成),以及該組合的每張卡的平均水平。

這是我的查詢:

db.matches.aggregate([ 
    {$unwind: "$players"}, 
    {$group: { 
      '_id': '$players.spells.card', 
      'count': {'$sum' : 1} 
     } 
    }, 
    {$sort: {'count' : -1}} 
]); 

下面是一個匹配文件的樣子,每場比賽都有2名球員:

{ 
    "_id" : 123, 
    "players" : [ 
     { 
      "id" : 41, 
      "spells" : [ 
       { 
        "card" : 11, 
        "level" : 2 
       }, 
       { 
        "card" : 12 
       }, 
       { 
        "card" : 13, 
        "level" : 2 
       }, 
       { 
        "card" : 14 
       }, 
       { 
        "card" : 15, 
        "level" : 2 
       }, 
       { 
        "card" : 16, 
        "level" : 2 
       }, 
       { 
        "card" : 17, 
        "level" : 2 
       }, 
       { 
        "card" : 18 
       } 
      ] 
     }, 
     { 
      "id" : 31, 
      "spells" : [ 
       { 
        "card" : 7 
       }, 
       { 
        "card" : 88 
       }, 
       { 
        "card" : 9 
       }, 
       { 
        "card" : 10 
       }, 
       { 
        "card" : 11 
       }, 
       { 
        "card" : 12 
       }, 
       { 
        "card" : 13 
       }, 
       { 
        "card" : 14 
       } 
      ] 
     } 
    ] 
} 

在此先感謝您的幫助!

+0

是什麼櫃ID,什麼是players.spells.d? – sergiuz

+0

我更新了上面的查詢,d應該是卡,我正在讓事情變得更容易閱讀,並忘記了一個地方:) – ruinernix

回答

0

在這裏你去:

db.matches.aggregate([ 
    {$unwind: "$players"}, 
    {$unwind:"$players.spells"}, 
    {$group:{"_id":"$players.id","count":{"$sum":"$players.spells.card"}} 
}]) 
+0

感謝您的嘗試,但不是解決方案:(它看起來像你錯過了部分_id應該是所有卡ID的連接,而不是玩家ID,我有興趣知道上面查詢中缺失的每張卡的平均水平。 – ruinernix

+0

db.testC.aggregate([{$ unwind:「$ players 「},{$ unwind:」$ players.spells「},{$ group: {」_id「:」$ _ id「,」count「:{」$ sum「:」$ players.spells.card「}, 「avg」:{「$ avg」:「$ players.sp ells.level」}}})); –

+0

您需要爲所有卡片添加等級,也需要添加等級1。在應用程序中進行操作,檢查該級別是否存在 –