web-dev-qa-db-ja.com

PyMongo upsertが「upsertはboolのインスタンスでなければならない」エラーをスローする

PythonからMongoDBの更新を実行しています。私はこの行を持っています:

self.Word_counts[source].update({'date':posttime},{"$inc" : words},{'upsert':True})

ただし、次のエラーがスローされます。

raise TypeError("upsert must be an instance of bool")

しかし、Trueは私にとってはboolのインスタンスのように見えます!

この更新プログラムを正しく書き込む方法を教えてください。

PyMongoの3番目の引数 update()upsertであり、辞書ではなくブール値を渡す必要があります。コードを次のように変更します。

_self.Word_counts[source].update({'date':posttime}, {"$inc" : words}, True)
_

または、_upsert=True_をキーワード引数として渡します。

_self.Word_counts[source].update({'date':posttime}, {"$inc" : words}, upsert=True)
_

MongoDB docsupdate()を読んだことが原因である可能性があります。 JavaScriptバージョンのupdateは、upsertmultiなどのオプションのパラメーターを含むオブジェクトを3番目の引数として受け取ります。しかしPythonは位置引数のみを持つJavaScriptとは異なり)キーワード引数を関数に渡すことができるため、これは不要であり、PyMongoは代わりにこれらのオプションをオプションの関数パラメーターとして使用します。

98

http://api.mongodb.org/python/2.3/api/pymongo/collection.html#pymongo.collection.Collection.update によると、実際には単なるtrueではなくキーワードとしてupsertを渡す必要があります、 あれは

self.Word_counts[source].update({'date':posttime},{"$inc" : words},**{'upsert':True})

または

self.Word_counts[source].update({'date':posttime},{"$inc" : words},upsert=True)

argの順序が保持されない場合、safemultiなどの他のkwargsコードが壊れる可能性があるため、Trueを渡すよりも優れたアプローチです。

14

upsertは、次のように位置パラメータとして渡す必要があります

self.Word_counts[source].update(
    {'date':posttime},
    {"$inc" : words},
    True)

または、キーワード引数として

self.Word_counts[source].update(
    {'date':posttime},
    {"$inc" : words},
    upsert=True)
4