【问题标题】:Unable to update document without specify Primary Key无法在不指定主键的情况下更新文档
【发布时间】:2021-02-19 11:35:11
【问题描述】:

schema.py:

class Test(Document):
    _id = StringField()
    classID = StringField(required=True, unique=True)
    status = StringField()

=====================

数据库.py:

query = schema.Test(_id = id)
query.update(status = "confirm")

出现严重错误。尝试更新尚未保存的文档

只有指定 _id = StringField(primary_key=True) 才能更新数据库,但如果我插入新数据,_id 必须由我插入,而不是由 MongoDB 自动创建。

任何人都可以帮助我解决问题吗? 谢谢!

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    插入和更新是 MongoDB 中不同的操作:

    • Insert 将文档添加到集合中
    • 更新在给定搜索条件的集合中查找文档,然后更改此文档

    如果您还没有插入文档,尝试更新它不会有任何作用,因为任何搜索条件都不会找到它。您的 ODM 会向您指出这一点,并阻止您更新尚未保存的文档。使用驱动程序,您仍然可以发布更新,但不会有任何效果。

    如果要向数据库添加新文档,请使用插入。要更改已保存的文档,请使用更新。要更改文档实例上的字段而不保存它们,请查阅您的 ODM 文档以了解如何执行此操作,而不是尝试保存文档。

    【讨论】:

    • 也许我不清楚。我已插入文档。我在 _id 上插入了没有任何值的文档(因此 _id 将由 MongoDB 自动生成)并且我没有将 _id 字段指定为主键。因此问题出现了。当我调用 db 容器并使用 _id --> (query = schema.Test(_id = id) --> 可能是更新其他字段的 PK 时,它显示了上述错误。如果我将 _id 指定为 PK一开始,它要求我插入_id的值。我希望它有意义。
    • 不要太多。 MongoDB 没有主键的概念。添加一些文档参考来解释更新方法的作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2010-12-02
    • 2021-10-09
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多