如何从json更新Mongoengine的DynamicDocument
我想找到一种优雅的方法来更新一个已经存在的MongoDB文档,这些更新的数据是从网页以json格式接收到的。问题是,我事先不知道哪些字段会被更新,所以我不能使用set__field,我手上只有一个json格式的字段表示,来更新我的MongoDB文档。而且我还在使用DynamicDocuments,这样文档中可能会有新的字段需要设置。
class Study(DynamicDocument):
study_accession_nr = StringField()
study_name = StringField()
study_type = StringField()
比如说,json可能看起来像这样:
{"_id" : "123", "study_name" : "Statistics"}
或者
{"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"}
我可以很容易地通过控制台或者使用pymongo来做到这一点,但我不知道如何用Mongoengine来实现,除非我手动使用setattr(myDocInstance, nameOfField, val),但这样看起来就不太优雅了。谢谢!
2 个回答
1
这是正常的MongoEngine。在我的情况下,我从x-editable接收到一个表单,这个表单里的字段名称和我的数据库结构是一样的,所以我可以直接用这些字段去访问数据库。
ActivityType.objects.filter(id=request.form['pk']).update(**{'set__'+request.form['name']: request.form['value']})
8
你可以在创建这个类的时候直接传入数据:
data = {"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"}
doc = Study(**data)
如果你想更新已经存在的模型,可以选择调用更新(更推荐这种方式),或者修改模型后再调用保存。
比如:
Doc.update(set__VAR=Val, set__VAR2=Val2)
或者
setattr(Doc, 'VAR', val)
setattr(Doc, 'VAR2', val2)
Doc.save()
或者
Doc.VAR = val
Doc.VAR2 = val2
Doc.save()