2017-02-08 17 views
1

私はスタックオーバーフロー全体をクロールしましたが、結果セットに含まれる適切なページネーションデータを返す方法に関する情報は見つかりませんでした。ページングされたデータと合計によるMongoの集約

私はmongoストアからいくつかのデータを集計しようとしています。私が欲しい、何かのリターンを持つことです。

{ 
    total: 5320, 
    page: 0, 
    pageSize: 10, 
    data: [ 
    { 
     _id: 234, 
     currentEvent: "UPSTREAM_QUEUE", 
     events: [ 
     { ... }, { ... }, { ... } 
     ] 
    }, 
    { 
     _id: 235, 
     currentEvent: "UPSTREAM_QUEUE", 
     events: [ 
     { ... }, { ... }, { ... } 
     ] 
    } 
    ] 
} 

これは私がこれまで持っているものです。

// page and pageSize are variables 
db.mongoAuditEvent.aggregate([ 
    // Actual grouped data 
    {"$group": { 
    "_id" : "$corrId", 
    "currentEvent": {"$last": "$event.status"}, 
    "events": { $push: "$$ROOT"} 
    }}, 
    // Pagination group 
    {"$group": { 
    "_id": 0, 
    "total": { "$sum": "corrId" }, 
    "page": page, 
    "pageSize": pageSize, 
    "data": { 
     "$push": { 
     "_id": "$_id", 
     "currentEvent": "$currentEvent", 
     "events": "$events" 
     } 
    } 
    }}, 
    {"$sort": {"events.timestamp": -1} }, // Latest first 
    {"$skip": page }, 
    {"$limit": pageSize } 
], {allowDiskUse: true}); 

私は内部の実際のグループ化されたデータを含む、rootとして改ページ・グループを持ってしようとしています(従って、私は実際の合計を得るが、まだskiplimitsを保持している)。

はMongoのコンソールで、次のエラーが返されます上記のコードは:私が削除した場合BSONObj size: 45707184 (0x2B96FB0) is invalid. Size must be between 0 and 16793600(16MB) First element: id: 0

The field 'page' must be an accumulator object

私はまだ、次のエラーを取得し、ページネーショングループからpagepageSize削除した場合ページ区切りのグループは、クエリが正常に動作します。しかし、私は実際に何個の文書を返す必要がありますか?total、実際には必要ないものはpagepageSizeです。

誰かが私が間違っていることを教えていただけますか?または、これを一度に行うことが可能なのかどうか教えてください。

+0

でそれを解決しました動作しないでしょう*?エラー?予想外の結果ですか?クエリのどの部分が失敗するのですか? –

+0

上記の編集のようなエラーメッセージを追加しました –

答えて

3

あなたはイベントがたくさんある場合は、{$プッシュ:「$$ ROOTは」}、モンゴはエラーを返すようになります、私はあなたが*、それはどういう意味ですか$ファセット

aggregate([ 
    { $match: options }, 
    { 
     $facet: { 
     edges: [ 
      { $sort: sort }, 
      { $skip: skip }, 
      { $limit: limit }, 
     ], 
     pageInfo: [ 
      { $group: { _id: null, count: { $sum: 1 } } }, 
     ], 
     }, 
    }, 
    ]) 
+1

お寄せいただきありがとうございます。それは本当に私を助けます。 – ilyapt

1

は1つではなく、2つの段階でこれをしなかった:

// Get the totals 
db.mongoAuditEvent.aggregate([{$group: {_id: "$corrId"}}, {$group: {_id: 1, total: {$sum: 1}}}]); 

// Get the data 
db.mongoAuditEvent.aggregate([ 
    {$group: { 
    _id : "$corrId", 
    currentEvent: {"$last": "$event.status"}, 
    "events": { $push: "$$ROOT"} 
    }}, 
    {$sort: {"events.timestamp": -1} }, // Latest first 
    {$skip: 0 }, 
    {$limit: 10} 
], {allowDiskUse: true}).pretty(); 

を誰もがこのかかわらへのよりよい解決策を得た場合、私は非常に幸せになります。

+0

これは2.4 mongoを壊しませんか? https://docs.mongodb.com/manual/reference/operator/aggregation/limit/ – Petrogad

関連する問題