2012-04-18 2 views
1

を使用してフィールドを更新し、私は、これは、ここでのmongoシェルから達成することができる方法を説明しました:MongoDB: Updating documents using data from the same documentpymongo:別のフィールド

しかし、私はPythonのドライバを使用してこれを行う方法を見つけ出すことはできません。私の目標は、(MySQLの同等に)ことである。

UPDATE coll SET field1 = field1 + field2; 

答えて

2

はこれまでのところ、私は最も簡単な方法は、適応することがわかったリンクSO、何かのように)(db.evalでpymongo.code.Codeクラスを使用して答える:

db.eval(Code("function() {" 
      "coll.find({}, {field1: 1, field2: 2})" 
      ".forEach(function(doc) {" 
      " doc.field1 += doc.field2;" 
      " coll.save(doc);" 
      " });" 
      "}")) 

あなたは、必要に応じて保存することができますjsスクリプトをサーバー上のmongoシェルからdb.system.js.save({_id:'myfunc', value: function(){...}}); と実行してpythonからdb.eval(Code('return myfunc()'))

+1

MongoDB(2.0.x以前のすべて)の現行リリースでは、サーバー上で1つのjavascriptプロセスしか同時に実行できないことに注意してください。この特定の機能は非常に高速ですが、Map-Reduceジョブが同時に実行されていると、この機能がブロックされることがあります(またはその逆)。これらの理由から、サーバー側のjavascriptは一般的に控えめに使用する必要があります。 – dcrosta

+0

警告ありがとうございます。それを覚えておいてください。 – richard

-2
Col.update({}, {'$set': {'field1': field1 + field2}) 

空{}選択基準、またはwhere句です。

+0

私はなぜフィールド1とフィールド2の前後に引用符がないのか混乱しています。これらは前のクエリから定義されることはありません。 – richard

+0

これを行うには、ドキュメントを照会し、アプリケーションコードでフィールド連結を実行する必要があります。 MongoDBは現在、このサーバ側では実行できません(この機能要求の実装状況を追跡するには、https://jira.mongodb.org/browse/SERVER-4079を参照してください)。 – dcrosta

+0

明確にするために、私は連結の代わりに合計を意味しましたmysqlではCONCAT(field1、field2)となりますが、同じ違いがあります。 – richard