tl;dr 这只是一个丑陋的 monkey-patch 方法.
在 MongoDB 2.4 及以前版本中, db.foo.update({…}, {“$set”: {}}), 也即 “空 $set” 是可以正常执行的. 配合 upsert 等参数执行时可以有不同的方便用法. 但是升级到 MongoDB 2.6 以后, 由于引入了严格的参数检查, 试图进行空 $set 操作时, 会出现这样的错误:
1 |
OperationFailure: '$set' is empty. You must specify a field like so: {$mod: {<field>: ...}}" |
由于本猫不太想改依赖这个方法的代码逻辑(有点多…), 于是写了一个丑陋的 monkey patch 来 workaround 这个问题:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Monkey patch pymongo to allow empty $set from pymongo import collection pymongo_collection_update = collection.Collection.update def pymongo_collection_update_with_empty_set_support(self, spec, document, *args, **kwargs): if "$set" in document and document["$set"] == {}: document.pop("$set") if document == {}: return None return pymongo_collection_update(self, spec, document, *args, **kwargs) collection.Collection.update = pymongo_collection_update_with_empty_set_support |
上游 Bug Report: https://jira.mongodb.org/browse/SERVER-12266 (已经确定不会修)