2016-12-05 157 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。在应用程序中进行操作,检查该级别是否存在 –