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

时间:2017-01-27 15:12:50

标签: mongodb python-2.7 pymongo

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

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

我试图在只有主设备的副本集中插入文档(从设备被阻止)

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

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

1 个答案:

答案 0 :(得分:2)

如果您将任何写入关注选项传递给&#34;更新&#34;,它们会替换 all 默认的写入关注选项。我不认为我们已经证明了这一点。

无论如何,&#34;更新&#34;不推荐使用更清晰的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)

请参阅PyMongo 3指南:

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

此外,我建议您以典型的方式使用Python对象,如我的示例所示:实例化对象并在实例上调用方法,而不是在类上调用方法并将实例作为&传递#34;自&#34;