Pymongo:为集合更新设置 w 覆盖默认写关注选项

YAP*_*PPO 2 mongodb pymongo python-2.7

我有一个 pymongo 集合,它的写关注选项如下:

>>> col1.__class__.__bases__
(<class 'pymongo.collection.Collection'>,)
>>> col1.write_concern
{'wtimeout': 6000}
Run Code Online (Sandbox Code Playgroud)

我试图在只有主可用的副本集中插入一个文档(从被阻止)

>>> pymongo.collection.Collection.update(col1, {'_id': '11'}, { "_id" : "11", "key": "test" }, upsert=True, fsync=False, w=2)
Run Code Online (Sandbox Code Playgroud)

pymongo 永远挂起。似乎设置 w=2 将默认 wtimeout 值显式覆盖为 0。如果我将 wtimeout=6000 发送给update它,它将按预期抛出异常。我错过了什么,还是应该以这种方式工作?

A. *_*vis 5

确实,如果您将任何写关注选项传递给“更新”,它们将替换所有默认的写关注选项。我不认为我们已经记录了这一点。

无论如何,“更新”已被弃用,取而代之的是更清晰的 update_one 和 update_many 方法:

>>> from pymongo import WriteConcern
>>> collection = MongoClient().db.collection
>>> coll2 = collection.with_options(
...     write_concern=WriteConcern(w=2, wtimeout=6000))
>>> oid = coll2.replace_one({'_id': '11'}, { "_id" : "11", "key": "test" },
                            upsert=True)
Run Code Online (Sandbox Code Playgroud)

请参阅 PyMongo 3 指南:

http://api.mongodb.com/python/current/migrate-to-pymongo3.html#the-write-concern-attribute-is-immutable

此外,我建议您以典型的方式使用 Python 对象,如我的示例:实例化一个对象并在实例上调用一个方法,而不是在类上调用一个方法并将实例作为“self”传递。