【问题标题】:Slice an array in MongoDB's aggregation framework在 MongoDB 聚合框架中对数组进行切片
【发布时间】:2015-11-09 13:55:48
【问题描述】:

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

通过聚合框架,我能够从我的已完成游戏数据库中构建以下中间管道结果(下面的每个玩家都完成了 5 场比赛并获得了分数):

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

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

$limit 如果我只需要一个玩家的结果,就可以正常工作。我也尝试过使用 $slice,但这似乎在聚合框架中不起作用。

那么我如何获得每个玩家的三个最佳结果的总和?

【问题讨论】:

  • 不幸的是,聚合框架中没有数组索引或$slice 运算符(如MongoDB 2.2.2)。您可以投票并观看现有的功能请求:SERVER-4589。作为一种解决方法,您要么必须在应用程序代码中实现最终总和,要么使用 Map/Reduce。
  • 好的,非常感谢。

标签: mongodb


【解决方案1】:

你提到了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'}}}

得到结果。

【讨论】:

  • 我认为你误解了我的意思。可以在这里获取前三个元素(5 个中的前 3 个),然后我可以总结整个数组(包含 3 个元素),类似于您所做的。但是我以前不知道如何获得 3 个最佳值,我只能抓取整个数组。
【解决方案2】:

$slice method for aggregation framework 是在 3.2 版本的 mongo 中添加的。如需更详细的答案,请查看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 ]

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2018-01-16
    • 1970-01-01
    • 2013-07-20
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多