从这里,
我需要使用
from_json
更新现有文档数据。
当我使用
from_json
喜欢时
>> user = User.objects(pk=2).first()
>> print user.to_json()
以上显示
>> {"_id": 1, "_cls": "User", "name": "OldName"}
现在我更新现有的
user
对象
>> user = user.from_json(json.dumps({"_id": 1, "_cls": "User", "name": "NewName"}))
>> user.save()
>> print user.to_json()
它显示
>> {"_id": 1, "_cls": "User", "name": "NewName"}
但无法在数据库中更新。
我再次查询相同的
user
它显示
>> {"_id": 1, "_cls": "User", "name": "OldName"}
我的问题是如何使用文档对象方法更新现有数据
from_json
?
对我来说以下工作有效:
user.update(**mydictname) #mydictname contains the dictionary of values I want to update
user.save()
user.reload() #not doing this makes the changes available only after the object is reloaded elsewhere
恐怕这是一个常见问题,可能尚未解决,这是 MongoEngine 源代码的链接,您可以搜索“from_json”以查看是否可以通过弄清楚该函数实际在做什么来进行破解:https://github.com/MongoEngine/mongoengine/blob/master/mongoengine/queryset/base.py;
对我来说,我只需迭代 json 数据的
(key, value)
并通过以下方式手动设置:
Batman = User.objects.get('user_id'='blah')
data = {'username':'batman', 'password':'iLoveGotham'}
for (key, val) in data.items():
Batman[key] = val
Batman.save()
它可以工作,但希望
from_json
函数能够真正工作,以便这个过程变得更加优雅。
如果您在 Mongo Shell 中搜索该文档,它也不会更新吗?如果没有,请停止阅读这里。保存不会自动更新对象,但我想如果你调用类似的东西:
>> user = user.from_json(json.dumps({"_id": 1, "_cls": "User", "name": "NewName"}))
>> user.save()
>> user.reload()
>> print user.to_json()
我自己刚刚学习 Mongoengine,但这里有一个很好的资源:http://docs.mongoengine.org/guide/
有点晚了,但是这个thread中的解决方案对我有用。要更新现有文档,您需要将created=True参数添加到from_json。
引用链接上的解释:
.from_json 方法实际上采用一个未记录的创建参数,默认为 False。如果将其设置为 True,您将获得预期的行为。
当使用 .from_json(json_data,created=False) 和 json_data 中的 id 属性时 mongoengine 假设您正在为其提供现有文档的初始结构(这听起来很公平),因此当您 .save() 它时,它不会保存任何内容,因为它假设没有任何更改,但一旦您更新属性,它就会开始跟踪更改,它实际上会保存它们。
使用 .from_json(json_data,created=True) 时 mongoengine 会认为它是您正在加载的全新文档,但由于它最终会触发 upsert 查询(而不是插入),因此它将工作并更新名称
因此使用以下代码可以按预期工作:
user = user.from_json(json.dumps({"_id": 1, "_cls": "User", "name": "NewName"}), created=True)
user.save()
print user.to_json()