2011-07-06 34 views
38

db.collection.find().limit(10)のようなものを実装するにはどうすればよいですか?mongodbの更新文書数を制限する方法

今私はdb.collection.find().limit()でドキュメントを取得してからそれらを更新するような、本当に嫌なことを使用しています。

一般に、与えられたレコード数を返し、それぞれのフィールドを1つずつ変更したいと考えています。

ありがとうございました。

+5

を使用して大量の文書を更新することができますがあり、このためのオープンチケット(2010年以来、V1.6.0)https://jira.mongodb.org/browse/SERVER-1599ですが、スケジュールされていませんすぐにリリースする予定です。 – zamnuts

答えて

10

残念ながらAFAIKを実行する唯一の方法は、あなたの回避策です。 (trueの場合)すべての一致を更新するか、または最初の一致を更新する(falseの場合)ブール値フラグmultiがあります。

-6

更新プログラムに制限を適用する目的がわかりません(SQLでは可能ではありません)。 ロブスターworte:更新は、更新基準に一致する1つの文書またはすべての文書でのみ機能します。そのため、以前のクエリに基づいて要件をニーズに合わせるか、または1つずつ更新する必要があります。

を使用でき
+2

は両方のアプローチを自分のデータでテストし、find()allとそれからupdate()はfind_and_modify()の方がはるかに高速です。これを行う方法の1つです。 – awsum

+12

これは実際には当てはまりませんが、もちろんSQLの更新に制限を加えることができます。例: "UPDATEテーブルSET x = 1 WHERE x = 0 LIMIT 10" –

27

db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach(
    function (e) { 
     e.fieldToChange = "blah"; 
     .... 
     db.collection.save(e); 
    } 
); 

は(forEachのコードのためのクレジット:MongoDB: Updating documents using data from the same document

これが何をするかだけで、指定したエントリの数を変更です。だから、あなたはあなたがしても、残りの半分を作りたい場合たとえば、あなたが

db.collection.find().limit(db.collection.count()/2).forEach(
    function (e) { 
     e.newField = 1; 
     db.collection.save(e); 
    } 
); 

に置くことができ、「コレクション」内のエントリの半分だけに値1を持つ「ニューフィールド」と呼ばれるフィールドを追加したい場合「ニューフィールド」を持っていますが、値が2で、あなたはニューフィールドが存在しない状態でアップデートを行うことができます。答えは更新するドキュメントの数を制限する方法はまだありません述べたよう

db.collection.update({ newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true}); 
+0

ニース、Mongoシェルでも動作します –

1

(または削除)を値> 1に変更します。

db.collection.find(<condition>).limit(<limit>).forEach(function(doc){db.collection.update({_id:doc._id},{<your update>})}) 
6

すべてのオブジェクトに対して反復処理を行い、個別に更新するソリューションは非常に遅いです。

$inを使用してそれらをすべて取得して同時に更新する方が効率的です。

ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id) 
People.in(_id: ids).update_all(lastname: 'Cantero') 

クエリはMongoidを使用して記述されますが、Mongo Shellでも簡単に書き換えられます。

3

forEachを使用すると、各文書を個別に更新するのが遅くなります。あなたはFYI

ids = db.collection.find(<condition>).limit(<limit>).map(
    function(doc) { 
     return doc._id; 
    } 
); 
db.collection.updateMany({_id: {$in: ids}}, <update>}) 
関連する問題