【问题标题】:How to update from json a Mongoengine DynamicDocument如何从 json 更新 Mongoengine DynamicDocument
【发布时间】:2014-03-13 10:41:24
【问题描述】:

我正在尝试找到一种 优雅 的方式来更新现有的 MongoDB 文档,其中包含从网页接收到的 json 数据。问题是我事先不知道要更新哪些字段 - 所以我不能使用 set__field,我的 MongoDB 文档中只有要更新的字段的 json 表示。另外,我使用的是 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),这对我来说看起来不太优雅。 谢谢!

【问题讨论】:

  • 如果你需要纯粹的无模式数据库,为什么要选择规则严格的ORM?你应该试试 pymongo。
  • 因为我想拥有文档和嵌入文档的层次结构,并定义一组必填字段,而我在可选字段上相当灵活。
  • “文档和嵌入文档的层次结构”是您作为开发人员而不是 ORM 的任务,“并且定义一组必填字段”如果我们谈论 Web 应用程序,您可以验证来自用户的表单。跨度>
  • 它不仅仅是一个 Web 应用程序,它是一个复杂应用程序的后端,它在前端公开了一个 REST API。是的,我可以在应用程序的逻辑中定义文档的层次结构,但是我还必须重写一些由 ORM(Mongoengine)实现的功能
  • 我明白了......好吧,那么谢谢你的建议。我开始对 Mongoengine 有点恼火,因为我找不到好的完整示例来说明如何执行文档中提到的操作,以及每个参数的外观。

标签: python mongoengine


【解决方案1】:

您可以在启动课程时传递数据:

data = {"_id" : "123", "study_type" : "research", "study_name" : "Statistical analysis"}
doc = Study(**data)

要更新现有模型,您可以调用 update(首选)或更改模型并调用 save。

例如:

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()

【讨论】:

  • 是的,但我需要修改一个现有文档,该文档在过去已经启动。
  • 您需要在模型上或通过发出更新查询来设置属性。
  • 好的。如果我在模型上设置属性 - 并假设它们是固定的,更新查询的外观如何,以防我事先不知道要更新哪些字段,而我只是将它们作为 json 获取?
  • 更新了示例 - 最后两个实际上是相同的 - 但您可能希望通过添加基于 dict 的更新方法来抽象它
  • 好吧,这些大致也是我在想的解决方案。我认为可能有另一种方法可以做到这一点,使用 Mongoengine 的更新功能,但我无法让它工作。谢谢!
【解决方案2】:

普通的 MongoEngine。就我而言,我从 x-editable 收到了一个表单,其中包含与我的架构同名的字段,因此我可以使用它直接访问数据库。

ActivityType.objects.filter(id=request.form['pk']).update(**{'set__'+request.form['name']: request.form['value']})

【讨论】:

    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2012-01-16
    • 2011-12-07
    相关资源
    最近更新 更多