0

mongodb/python/pymongo の初心者。私の mongodb クライアント コードは問題なく動作します。ここにあります :

db.meteo.find().forEach( function(myDoc) {
db.test.update({"contract_name" : myDoc.current_observation.observation_location.city},
                      { $set: { "temp_c_meteo" : myDoc.current_observation.temp_c ,
                             }
                      },
                      {upsert:false,
                      multi:true}) 
              })

これにより、contract_name (テスト コレクションから) が current_observation.observation_location.city (meteo コレクションから) と等しい場合、テスト コレクション内のすべてのドキュメントに temp_c_meteo 列が追加されます。そして、それが私が欲しいものです!

しかし、これがPythonでも同じように機能することを望みます。Python 2.7-pymongo 2.6.3 がインストールされています。しかし、Python 2.4.6 (64 ビット) および 3.4.0 (64 ビット) も同様です。

Python スクリプトの一部を次に示します。

[...]

saveInDB:

    #BE connected to MongoDB client
    MDBClient = MongoClient()
    db = MDBClient ['test']
    collection = db['infosdb']

[...]

meteos = collectionMeteo.find()
for met in meteos:
  logging.info('DEBUG - Update with meteo ' + met['current_observation']['observation_location']['city'])
  result = collection.update_many( {"contract_name" : met['current_observation']['observation_location']['city']},
    {
        "$set": {"temp_c_meteo" : met['current_observation']['temp_c']}
    })

そして、私が得るエラーがあります: ==> [06/21/2016 10:51:03 AM] [WARNING]: 'Collection' object is not callable. 「コレクション」オブジェクトで「update_many」メソッドを呼び出すつもりだった場合、そのようなメソッドが存在しないため失敗しています。

この問題は、いくつかの pymongo リリースに関連している可能性があることを読みました (「メソッドの保存と更新は非推奨です」。そのため、update_many を使用しようとしています)。ありがとう

4

2 に答える 2

0

私がそれを機能させた方法があります: update_many はありませんが、更新します。

[...]

セーブインDB:

#BE connected to MongoDB client
MDBClient = MongoClient()
db = MDBClient.test
collection = db.infosdb
collectionMeteo = db.meteo

[...]

        try:
            meteos = collectionMeteo.find()
            for met in meteos:

                status = collection.find({"contract_name" : met['current_observation']
                ['observation_location']['city']})
                for stat in status:

                    result = collection.update(  {"_id" : stat['_id']},
                            {
                                "$set": {"temp_c_meteo" : met['current_observation']['temp_c']
                                        }

                                                     )                                                  
于 2016-06-28T16:32:12.323 に答える
0

ディクショナリ スタイル アクセスの代わりに属性スタイル アクセスを使用してみてください。

何かのようなもの

db = MDBClient.test
collection = db.infosdb
于 2016-06-21T15:12:33.460 に答える