web-dev-qa-db-ja.com

最大ドキュメントサイズを超えずに集計を作成するにはどうすればよいですか?

次のようなクエリでexceeds maximum document size problem例外が発生しました。

pipe = [
    {"$match": { "birthday":{"$gte":datetime.datetime(1987, 1, 1, 0, 0)} }}
    ]
res =db.patients.aggregate(pipe,allowDiskUse=True)

$project演算子を追加して修正しました。

しかし、ドキュメントがまだ16MBを超えている場合、$projectを使用してもどうなりますか?

私に何ができる ?何か案が ?ありがとうございました

pipe = [
    {"$project": {"birthday":1, "id":1}
    },
    {"$match": { "birthday":{"$gte":datetime.datetime(1987, 1, 1, 0, 0)} }
     }
    ]
res =db.patients.aggregate(pipe,allowDiskUse=True)

例外

OperationFailure: command SON([('aggregate', 'patients'), ('pipeline', [{'$match': {'birthday': {'$gte': datetime.datetime(1987, 1, 1, 0, 0)}}}]), ('allowDiskUse', True)]) on namespace tw_insurance_security_development.$cmd failed: exception: aggregation result exceeds maximum document size (16MB)
8
newBike

デフォルトでは、集計の結果は単一のBSONドキュメントで返されます。これは、サイズ制限の原因です。それ以上を返す必要がある場合は、次のいずれかを行うことができます。

  • 結果をコレクションに出力します。これを行うには、パイプラインを次のように終了します。

    {"$ out": "some-collection-name"}

    次に、そのコレクションを通常どおりクエリします(完了したら、自分でコレクションを削除する必要があります)

  • 集計を呼び出すときにuseCursor=Trueを指定して、結果をカーソルとして返します。

これらのオプションは両方ともmongodb2.6を必要とします。mongodb2.4をまだ実行している場合、これは集計の基本的な制限にすぎません。

28

@Frederickが言ったように、少なくともmongo 2.6が必要です。詳細については、 ここ はmongoドキュメントからのリンクであり、runCommandの方法と同様に機能しますが、db.collection.aggreagateを使用するため、ドキュメントの制限には「カーソル」オプション、ソート制限には「allowDiskUse」オプションを使用します。

4
Ahmet Yeşil