【问题标题】:Update Mongoengine document without actively keeping track of the fields that changed在不主动跟踪更改的字段的情况下更新 Mongoengine 文档
【发布时间】:2014-11-05 15:40:47
【问题描述】:

我阅读了很多关于如何在 Mongoengine(和 MongoDB)中更新文档的问题和答案,但我的问题是他们都建议“手动”将所有想要更新的字段作为参数作为一个字典 - 例如

p.update(**{
    "set__name": "Hank",
    "set__address": "Far away"

})

我的问题如下:

  1. 我需要跟踪所有修改的字段
  2. 我需要在字典中指定我想要更新的所有字段的名称作为字符串
  3. 我需要指定一个特定于我正在修改的字段类型以及我在该字段上执行的操作的修饰符。

有没有办法以更高级别的方式使用 Python 更新 Mongoengine/MongoDB 中的文档? (更具体地说,我希望更新 MongoDB 中的文档,如果它自我上次从 DB 中读取后没有更改。)

所以我的应用程序相当复杂。我经常传递一个对象p,它对应于数据库中的一个文档,以便不同的方法修改它的字段,然后在所有更新结束时我想保存修改后的文档而不不必担心哪个字段发生了变化以及我需要使用什么修饰符。

任何建议我可以如何做到这一点或实施一些事情来做到这一点?

谢谢!

【问题讨论】:

  • 我相信您只是想在更改 Document 对象后调用 .save 方法(或者在您从任何类型创建的具有正确 _id 的新 Document 对象上调用p 代表 MongoDB 中的文档)。
  • 嗯,是的,除了如果我执行 save() 并且同时修改了对象,我认为这些更改将被覆盖。所以我目前拥有的是一个版本字段 => 只有当我的查询与 _id 和文档的版本匹配时,我才会更新。我不确定是否可以使用 save()
  • 使用 findAndModify(或一些围绕它的 API 包装器)进行版本控制,然后您可以使用 save 来更新整个文档。

标签: python mongodb updates mongoengine


【解决方案1】:

我刚刚找到了我的问题的答案:似乎从 mongoengine 0.8.5 开始,他们向 save() 函数添加了一个新参数 - 称为 save_condition - 这正是我所问的:

save_condition – only perform save if matching record in db 
                 satisfies condition(s) (e.g., version number)

(根据文档: http://docs.mongoengine.org/apireference.html)

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2015-01-12
    • 2020-11-05
    • 2016-07-02
    相关资源
    最近更新 更多