2017-12-01 8 views
0

私はmongodbに約10個のMioドキュメントを持つコレクションを持っています。私はいくつかのフィールドを変更するためにそれらのすべてをトラバースしたい。私の変更が条件を変更しませんので、同じ文書が再びたびに返されるので、NodeJS - マングースで大規模なコレクションを解析する

MyModel.find({/* condition... */}).limit(500).exec() 

を次のように一斉に取ると、それはあまりにも多くのデータがあるので、プログラムがクラッシュし、制限を使用することは問題です。

誰でも私がコレクション全体を徐々にトラバース/変更する方法をヒントできますか?

+0

mongodbの 'skip'集約を見てください。 –

答えて

1

Kevinは2つの有効なオプションについて概説しています。

もう1つのオプションは、本質的に改ページすることです。 _idでソートし、より大きい質問を続けている場合は、全く同じロジックを維持できます。_idような何か:

var lastId = new ObjectId(); 
MyModel.find({/* condition... */, _id: {$gt: lastId}}).sort({_id: 
1}).limit(500).exec(function(err, records){ 
    // Your logic 
    lastId = records[records.length - 1]._id; 
}) 

あなたはちょうどあなたが500件のレコードを受信しません一度非同期whileループのいくつかの並べ替えに機能をラップして、終了を確認する必要があると思います。

1

Model.updateメソッドを使用してみましたか? http://mongoosejs.com/docs/2.7.x/docs/updating-documents.htmlを参照してください。それが動作する方法は、クエリと更新ステートメントを指定し、クエリに一致するすべてのドキュメントを検索し、各ドキュメントに更新を適用することです。例えば。あなたは本当に見つける-その後、更新を使用する必要がある場合

const query = {}; 
const update = {$set: {name: "Bob"}}; 
const options = {}; 
Model.update(query, update, options, callback); 

は、あなたはおそらく、ストリーミングではなく、完全に一度にメモリで実現されている文書の集合を確保するカーソルを、使用したい:

const cursor = Model.find(query).cursor() 
cursor.on('data', function(doc) {}); 
cursor.on('close', callback); 
関連する問題