swa*_*psm 12 python mongodb pymongo
我正在研究pymongo,这是我的文件:
{
"_id": ObjectId("51211b57f07ddaa377000000"),
"assignments": {
"0": {
"0": {
"_id": ObjectId("5120dd7400a4453d58a0d0ec")
},
"1": {
"_id": ObjectId("5120dd8e00a4453d58a0d0ed")
},
"2": {
"_id": ObjectId("5120ddad00a4453d58a0d0ee")
}
}
},
"password": "my_passwd",
"username": "john"
}
Run Code Online (Sandbox Code Playgroud)
我想取消所有这些文档的"赋值"属性.我能够通过以下方式在mongo shell上实现此目的:
db.users.update({}, {$unset: {"assignments": 1}}, false, true)
Run Code Online (Sandbox Code Playgroud)
即,我将upsert和multi标志作为最后两个参数传递给用户集合上的更新函数函数.但是我用pymongo做了这个:
db.users.update({}, {"$unset": {"assignments": 1}}, False, True)
Run Code Online (Sandbox Code Playgroud)
但是python解释器抛出了如下错误:
File "notes/assignment.py", line 34, in <module>
db.users.update({}, {"$unset": {"assignments": 1}}, False, True)
File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 481, in update
check_keys, self.__uuid_subtype), safe)
File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 852, in _send_message
rv = self.__check_response_to_last_error(response)
File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 795, in __check_response_to_last_error
raise OperationFailure(details["err"], details["code"])
pymongo.errors.OperationFailure: Modifiers and non-modifiers cannot be mixed
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
Jam*_*wer 28
问题是你传入的两个标志不是upsert和multi.根据PyMongo的文档Collection.update(在这里找到),看起来你可能会传递值upsert和manipulate选项的值,虽然我不确定.
要解决这个问题,你需要做的就是使用Python最强大的功能之一:命名参数.通过指定要传递给哪些选项update,除了确保不会发生此类事故之外,还可以增加代码的清晰度.
在这种情况下,我们想要传递选项upsert=False和multi=True.
db.users.update({}, { "$unset": { "assignments": 1 } }, upsert=False, multi=True)
Run Code Online (Sandbox Code Playgroud)