4

集約フレームワークで遊んでみましたが、問題があります。先月、データベース内で何人が何かを購入したかを知る必要があります。

それを行うには、これを使用します:

db.account.aggregate([
{$project : {civility : 1, 'purchase.date' : 1 }},
{$match: {civility : 1 ,'purchase.date': {$gte: new Date('02/02/2013'), $lt: new Date('02/03/2013')} }},
{$unwind: '$purchase'},
{$match: {civility : 1 ,'purchase.date': {$gte: new Date('02/02/2013'), $lt: new Date('02/03/2013')} }},
{$group: {_id: '$_id', total_buy : {$sum : 1}}},
{$match: {total_buy: {$gte: 2}}},
{$group: {_id: null, total_buyer : {$sum : 1}}}
])

私はこの応答を持っています

{
"result" : [
{
"_id" : null,
"total_buyer" : 4443
 }
],
"ok" : 1
}

私が使用する日付の範囲が小さいため、このクエリは機能しますが、日付の範囲で同じクエリを使用すると、次のように大きくなります:

db.account.aggregate([
{$project : {civility : 1, 'purchase.date' : 1 }},
{$match: {civility : 1 ,'purchase.date': {$gte: new Date('02/01/2013'), $lt: new     Date('03/01/2013')} }},
{$unwind: '$purchase'},
{$match: {civility : 1 ,'purchase.date': {$gte: new Date('02/01/2013'), $lt: new    Date('03/01/2013')} }},
{$group: {_id: '$_id', total_buy : {$sum : 1}}},
{$match: {total_buy: {$gte: 2}}},
{$group: {_id: null, total_buyer : {$sum : 1}}}
])

私はこれを持っています:

{
"errmsg" : "exception: sharded pipeline failed on shard shard0000: { errmsg: \"exception: aggregation result exceeds maximum document size (16MB)\", code: 16389, ok: 0.0 }",
"code" : 16390,
"ok" : 0
}

私が間違っていることがありますか、それとも私がする必要があることをすることができませんか?

前もって感謝します

4

1 に答える 1

2

集計を改善するためにできることがいくつかあるようです。

1) を追加して、$project既に使用したフィールドを通過しないようにします (_id

2) 何かを購入した購入者の数が必要だと言いますが、期間中に 2 回以上の「時間」または「物」を購入した購入者のみを保持するようにフィルタリングしています。

結果:

db.account.aggregate([
   {$project : {civility : 1, 'purchase.date' : 1 }},
   {$match: {civility : 1 ,'purchase.date': {$gte: new Date('02/01/2013'), $lt: new     Date('03/01/2013')} }},
   {$unwind: '$purchase'},
   {$match: {civility : 1 ,'purchase.date': {$gte: new Date('02/01/2013'), $lt: new Date('03/01/2013')} }},
   {$project: {_id  :1}}, 
   {$group: {_id: '$_id', total_buys : {$sum : 1}}},
   {$group: {_id: null, total_buyers : {$sum : 1}}}
])

フィールドのサイズを考えると、_id各シャードが約 420,000 を超えるドキュメントと一致しない限り、現在のバージョン (2.4) で機能するはずです。各ドキュメントが購入を表しているため、まだ制限に達している可能性があると思われるため、いくつかの選択肢があります。

1) 2.6 (現在、不安定な開発リリース 2.5.2 として利用可能) まで待ちます。これにより、データセットのサイズの制限がなくなります (ここでは、最終的なサイズではありませんが、shard0000 が問題である mongos に戻さなければならないサイズです)。2) 別の方法を使用して、特定の期間中の個別の購入者をカウントします (それが本当に必要な場合は、元の集計がカウントしているものとは異なります)。

于 2013-09-01T20:39:10.813 に答える