次のようなクエリで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)
デフォルトでは、集計の結果は単一のBSONドキュメントで返されます。これは、サイズ制限の原因です。それ以上を返す必要がある場合は、次のいずれかを行うことができます。
結果をコレクションに出力します。これを行うには、パイプラインを次のように終了します。
{"$ out": "some-collection-name"}
次に、そのコレクションを通常どおりクエリします(完了したら、自分でコレクションを削除する必要があります)
集計を呼び出すときにuseCursor=True
を指定して、結果をカーソルとして返します。
これらのオプションは両方ともmongodb2.6を必要とします。mongodb2.4をまだ実行している場合、これは集計の基本的な制限にすぎません。
@Frederickが言ったように、少なくともmongo 2.6が必要です。詳細については、 ここ はmongoドキュメントからのリンクであり、runCommandの方法と同様に機能しますが、db.collection.aggreagateを使用するため、ドキュメントの制限には「カーソル」オプション、ソート制限には「allowDiskUse」オプションを使用します。