如何从json更新Mongoengine的DynamicDocument

8 投票
2 回答
4385 浏览
提问于 2025-04-17 19:04

我想找到一种优雅的方法来更新一个已经存在的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()

撰写回答