0

achievements次のドキュメントのように、フィールドの 1 つに大量のデータを含む Mongo ドキュメントがあります。

{'id':12345,'name':'eric','achievements':['...','...','...']}

フィールド全体をメモリにロードするのではなく、カーソルを使用してachievementsPHPのフィールドを単独で返す方法はありますか? このフィールドが非常に大きい (100 万項目を超える) 場合、大量のメモリが使用されます。

->find(['id'=>new MongoId('12345')],['achievements'])構文を試してみましたが、achievementsフィールド全体が配列としてメモリにロードされます。理想的には、一度に 1 つの実績をロードするカーソルが必要です。これは可能ですか?持っているとかなりクールな機能のようです...

乾杯

4

1 に答える 1

0

いいえ、MongoDB はデフォルトで完全なドキュメントを返します。お勧めのように、フィールド選択を使用して返されるフィールドを制限できます。配列の場合は、$slice演算子を使用して配列のサブセットのみを取得できます。ただし、その場合、配列の「次の」スライスを取得するには、新しいクエリと完全なネットワーク ラウンドトリップが必要です。

その他の 2 つの注意事項:

  1. MongoDB 2.1 (および今後の 2.2 安定版リリース) では、 Aggregation Framework$unwindでオペレーターを使用してこの動作をエミュレートできます。ただし、2.2 では、Aggregation Framework は常にネストされた配列を持つ単一のドキュメントとして結果を返すため、これでもメモリの問題を回避することはできません。

  2. ここでデータモデルを変更することを強く検討します。「何百万もの要素」の配列は、ドキュメントが大きくなり (MongoDB のドキュメント サイズの上限は 16 MB です)、アプリケーション コードにオーバーヘッドが追加されます。これをモデル化する方法に関するいくつかの代替アイデアについては、ここで説明したものと非常によく似たデータ モデルのユース ケースをカバーするSchema Design at Scaleを確認してください。

于 2012-04-18T15:44:23.020 に答える