10

mongoコレクション全体をスキャンして集計を計算したいと思いcustomます。私はマングースでノードを使用しています。私が使用していたテーブル全体をスキャンするためにMyModel.find({}, callback);

コードを実行すると、mongooseがクエリを実行し、目的のレコードを配列に収集してから、その配列全体をコールバックに渡すことがわかりました。現在、完全なコレクションスキャンでは、膨大な時間がかかります。

ロット全体が配列に収集されるのを待つのではなく、目的のレコードをコールバックに継続的にマッピングすることを繰り返すことができるカーソルオブジェクトを取得する可能性はありませんか。(これは私が観察したものです。間違っている場合は修正してください)。

また、カスタム集計の完全なコレクションスキャンを実行することが正しい方法であるかどうか、map-reduceまたはそのような代替手段を検討する必要があるかどうかについて、誰かにアドバイスしてもらえますか。

4

1 に答える 1

13

最初のオプションは、実行しようとしている集計を実行aggregateする代わりに、メソッドを使用することです。findそれでも必要なことができない場合は、mapReduce前述のように調べてください。

ただし、大きなコレクションを反復処理する必要がある場合は、クエリの結果を1つの大きな配列にまとめるのではなく、Mongooseのサポートを使用してクエリの結果をストリーミングする必要があります。

var stream = MyModel.find().stream();

stream.on('data', function (doc) {
  // do something with the mongoose document
}).on('error', function (err) {
  // handle the error
}).on('close', function () {
  // the stream is closed
});
于 2013-02-14T05:02:30.023 に答える