在MongoDB的聚合框架中切片数组

时间:2012-12-22 19:35:26

标签: mongodb

我正在将游戏结果保存在MongoDB中,并希望为每位玩家计算3个最佳结果的总和。

使用聚合框架,我可以从我的已完成游戏数据库中构建以下中间管道结果(下面的每个玩家已经完成了5个游戏并给出了得分):

    {
        "_id" : "Player1",
        "points" : [ 324, 300, 287, 287, 227]
    },
    {
        "_id" : "Player2",
        "points" : [ 324, 324, 300, 287, 123]
    }

现在我需要总结每个玩家的三个最佳值。我能够对数组进行排序,所以在这里也可以只获取每个数组的前3个元素,以便在下一个流水线步骤中构建数组的总和。

如果我只需要一个玩家的结果,那么

$ limit会正常工作。我也尝试使用$ slice,但这似乎不适用于聚合框架。

那么我如何得到每个球员三个最佳成绩的总和呢?

2 个答案:

答案 0 :(得分:0)

你提到了it would also be ok here to get only the first 3 elements of each array to build the sum of the array in the next pipeline step.,所以先做,然后使用:

db.test.aggregate({'$unwind':'$points'},{'$group':{'_id':'$_id','result':{'$sum':'$points'}}}

获得结果。

答案 1 :(得分:0)

在3.2版本的mongo中添加了

$slice method for aggregation framework。有关更详细的答案,请查看here

来自mongo页面的几个例子:

{ $slice: [ [ 1, 2, 3 ], 1, 1 ] }   // [ 2 ]
{ $slice: [ [ 1, 2, 3 ], -2 ] }     // [ 2, 3 ]
{ $slice: [ [ 1, 2, 3 ], 15, 2 ] }  // [  ]
{ $slice: [ [ 1, 2, 3 ], -15, 2 ] } // [ 1, 2 ]