2017-08-23 7 views
0

コレクション内にはたくさんの文書があります。それは次のように コレクション内の文書のそれぞれの構造は次のとおりです。マルチはpymongoを使ってコレクションの文書に沿ってキーを更新します

{ 
"_id" : ObjectId(....), 
"valor" : { 
    "AB" : { 
     "X" : 0.0, 
     "Y" : 142.6, 
    }, 
    "FJ" : { 
     "X" : 0.2, 
     "Y" : 3.33 

.... 

コレクションは現在、約200の文書を持っていると私はvalor内部の鍵の一つは、間違った名前を持っていることに気づきました。この場合、コレクションのすべての文書で「FJ」は「JOF」となります。

イムかなり確信して、pymongoのupdate機能を使用して、すべてのドキュメントでキーを変更することが可能です。私が直面している問題は、利用可能なオンラインドキュメントにアクセスしたときに、https://docs.mongodb.com/v3.0/reference/method/db.collection.update/は値を変更する方法(現在の状態を維持し、キーのみを変更したい)を説明することだけです。

これは私が試したものです:

def multi_update(spec_key,key_updte): 
    rdo=col.update((valor.spec_key),{"$set":(valor.key_updte)},multi=True) 
    return rdo 

print(multi_update('FJ','JOF')) 

しかし、出力name 'valor' is not defined。私はどのように私だけのコレクションのドキュメントに沿ってキーを更新することができ、対応するJSONに

にアクセスするためにvalor.specific_keyを使用しなければならないと思いましたか?

答えて

0

あなたには2つの問題があります。まず、valorはPythonコードの識別子ではなく、MongoDBドキュメントのフィールド名です。文字列にしてPyMongoの更新式で使用するには、Pythonで一重引用符または二重引用符で囲む必要があります。

2番目の問題は、MongoDBのupdateコマンドでは、あるフィールドに別のフィールドの値を設定したり、フィールドの名前を変更することができないということです。ただし、$project段階でaggregateコマンドを使用して、コレクション内のすべてのドキュメントを再形成し、$outのステージを使用して、第2のコレクションに結果を保存することができます。ここで

は一緒にプレイするための完全な例です:

db = MongoClient().test 
collection = db.collection 
collection.delete_many({}) 
collection.insert_one({ 
"valor" : { 
    "AB" : { 
     "X" : 0.0, 
     "Y" : 142.6, 
    }, 
    "FJ" : { 
     "X" : 0.2, 
     "Y" : 3.33}}}) 

collection.aggregate([{ 
    "$project": { 
     "valor": { 
      "AB": "$valor.AB", 
      "FOJ": "$valor.FJ" 
     } 
    } 
}, { 
    "$out": "collection2" 
}]) 

これは危険な部分です。まず、 "collection2"に必要なすべての文書が希望の形になっていることを確認します。その後:

collection.drop() 
db.collection2.rename("collection") 

import pprint 
pprint.pprint(collection.find_one()) 
関連する問題