tl;dr 这只是一个丑陋的 monkey-patch 方法.
在 MongoDB 2.4 及以前版本中, db.foo.update({…}, {“$set”: {}}), 也即 “空 $set” 是可以正常执行的. 配合 upsert 等参数执行时可以有不同的方便用法. 但是升级到 MongoDB 2.6 以后, 由于引入了严格的参数检查, 试图进行空 $set 操作时, 会出现这样的错误:
OperationFailure: '$set' is empty. You must specify a field like so: {$mod: {: ...}}"
由于本猫不太想改依赖这个方法的代码逻辑(有点多…), 于是写了一个丑陋的 monkey patch 来 workaround 这个问题:
# 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 (已经确定不会修)
新技能GET√~赞瞄大~~\(≧▽≦)/~