1

在上一个问题中,我想使用管道操作获取结果组的计数。按照建议,我使用了以下内容:

db.test.aggregate(
    {$unwind: '$tags'}, 
    {$group:{_id: '$tags', count:{$sum:1}}},
    {$project:{tmp:{tag:'$_id', count:'$count'}}}, 
    {$group:{_id:null, total:{$sum:1}, data:{$addToSet:'$tmp'}}}
)

现在知道了计数,我想按页面显示结果,所以我只需要data. 我最初的想法是在管道中使用$sliceon ,例如:data$project

...
{$project: {data : { $slice: [20,20] }, total: 1}

但它似乎$slice不是一个有效的操作$project。我尝试了一种解决方法:

db.test.aggregate(
    {$unwind: '$tags'}, 
    {$group:{_id: '$tags', count:{$sum:1}}},
    {$project:{tmp:{tag:'$_id', count:'$count'}}}, 
    {$group:{_id:null, total:{$sum:1}, data:{$addToSet:'$tmp'}}},
    {$unwind: '$data'},
    {$skip: 20},
    {$limit: 20}
)

但看起来,我执行了另一个$unwind管道。有没有更好的解决方案来实现我想要做的事情?

4

2 回答 2

3

不幸的是,目前(在 MongoDB 2.2 中)没有聚合框架运算符来获取$slice或获取数组的子集。

您将需要使用一种解决方法,例如:

  • 您的使用$skip$limitaggregate()管道中
  • 操作应用程序代码中的结果。
  • 使用Map/Reduce实现聚合

MongoDB 问题跟踪器中有一个现有的功能请求,您可以投票/观看:SERVER-6074: Allow $slice operator in $project

于 2013-01-01T06:42:25.430 回答
0

正如 Stennie 所说,在2.2 版本的 mongo 中没有$slice聚合框架,但在即将发布的3.2 版本的 mongo 中,他们添加了它。

所以现在你可以在聚合中使用 $slice 了。从数组的开头或结尾{ $slice: [ <array>, <n> ] } 返回元素: 从数组中的指定位置返回元素:{ $slice: [ <array>, <position>, <n> ] }

还有来自 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 ]
于 2015-11-09T05:52:51.767 回答