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ます。私の最初の考えは、次のようなパイプライン内で使用$sliceすることです。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 のように)配列のサブセットを取得したり取得したりするAggregation Framework演算子はありません。$slice

次のような回避策を使用する必要があります。

  • $skipおよびパイプライン$limitでの使用aggregate()
  • アプリケーション コードでの結果の操作。
  • Map/Reduceを使用した集計の実装

MongoDB イシュー トラッカーには、賛成/監視できる既存の機能リクエストがあります: SERVER-6074: $project で $slice オペレーターを許可します

于 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 に答える