的Upsert和pymongo
问题描述:
多标志我的工作pymongo,这是我的文档:的Upsert和pymongo
{
"_id": ObjectId("51211b57f07ddaa377000000"),
"assignments": {
"0": {
"0": {
"_id": ObjectId("5120dd7400a4453d58a0d0ec")
},
"1": {
"_id": ObjectId("5120dd8e00a4453d58a0d0ed")
},
"2": {
"_id": ObjectId("5120ddad00a4453d58a0d0ee")
}
}
},
"password": "my_passwd",
"username": "john"
}
我想取消设置所有这些文档的“分配”属性。 我能够这样做,以实现这一在蒙戈外壳:
db.users.update({}, {$unset: {"assignments": 1}}, false, true)
即,我通过UPSERT和多标志作为最后两个参数对用户收集的更新功能功能。 但是我这样做与pymongo:
db.users.update({}, {"$unset": {"assignments": 1}}, False, True)
但是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
我要去哪里错了?
答
问题是您传入的两个标记不是upsert
和multi
。根据PyMongo的文档Collection.update
(找到here),看起来您可能会传入upsert
和manipulate
选项的值,但我不确定。
你所要做的就是解决这个问题,就是使用Python最棒的特性之一:命名参数。通过指定您传递给update
的哪些选项,除了确保这样的事故不会发生之外,您还可以增加代码的清晰度。
在这种情况下,我们想通过选项upsert=False
和multi=True
。
db.users.update({}, { "$unset": { "assignments": 1 } }, upsert=False, multi=True)
+0
哇!你太棒了,非常感谢你 – swaroopsm 2013-02-18 07:38:48
看看http://stackoverflow.com/questions/14443478/remove-subfields-from-mongodb-document也许你会发现一些熟悉的东西 – mderk 2013-02-17 20:19:37