在MongoDB的聚合框架中切割一个数组

5

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

使用聚合框架,我能够从完成的游戏数据库中构建以下中间管道结果(下面每个玩家都已完成5个具有给定分数的游戏):

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

现在我需要总结每个玩家的三个最佳值。我已经成功地对数组进行了排序,因此在下一个管道步骤中只需获取每个数组的前3个元素即可构建数组的总和。如果我只需要一个玩家的结果,则$limit可以很好地工作。我还尝试使用$slice,但似乎在聚合框架中无法使用。那么我该如何获得每个玩家的三个最佳结果的总和呢?

2
很遗憾,在聚合框架中(截至MongoDB 2.2.2),没有数组索引或$slice运算符。您可以投票并关注现有的功能请求:SERVER-4589。作为解决方法,您将不得不在应用程序代码中实现最终总和,或使用Map/Reduce。 - Stennie
2个回答

0

聚合框架的$slice方法在Mongo的3.2版本中被添加。如需更详细的答案,请查看此处

以下是来自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 ]

0

您提到过在下一条流水线步骤中,仅获取每个数组的前3个元素来构建数组总和也可以,因此请先执行此操作,然后使用:

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

获取结果。


我觉得你误解了我的意思。在这里获取前三个元素(五个中的前三个)是可以的,然后我可以对整个数组(使用这三个元素)进行求和,类似于你所做的方式。但是,我不知道如何获取前三个最佳值,我只能抓取整个数组。 - StefanMK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接