【问题标题】:Autoincrement with MongoEngine使用 MongoEngine 自动增量
【发布时间】:2012-02-11 07:36:51
【问题描述】:

我正在使用 Flask 和 MongoEngine 开发博客引擎,我的帖子需要顺序 ID。

我需要 MongoEngine 为每个新帖子创建一个新 ID,所以我正在考虑这样做:

class Post(Document):
  title = StringField(required=True)
  content = StringField(required=True)
  published_at = datetime.utcnow()
  id = Post.objects.count() + 1

这行得通吗?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    首先,您需要了解为什么需要增量 ID?他们解决了什么问题?

    mongoDB 中没有原生解决方案 - 请阅读:http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

    既然你已经有了一个与帖子的pk 相关的唯一标识符,为什么不使用它呢?

    最后,如果我没有劝阻你不要做傻事,mongoengine 中有一个SequenceField 可以为你处理增量。 https://mongoengine-odm.readthedocs.org/en/latest/apireference.html#mongoengine.fields.SequenceField

    【讨论】:

    • 我想要帖子和用户的增量 ID,自动生成的 ID 不适合在 URL 中使用,这就是我想创建自己的原因。
    • 当然可以,但是您可以制作人类可读的 slug - 这样它也将提高 url 的可访问性。
    • SequenceField 是 Mongoengine 中唯一也是最好的自动增量实现。
    【解决方案2】:

    编辑:这是一个不正确的解决方案,因为其他人指出这种方法会导致竞争条件。我只是把它留在这里,所以其他人会知道为什么这很糟糕。 (多个客户端可以访问同一个对象并增加它,导致结果不一致)。


    旧答案

    我想通了。

    Post 类如下所示:

    class Post(Document):
          title = StringField(required=True)
          content = StringField(required=True)
          published_at = datetime.utcnow()
          ID = IntField(min_value=1)
    

    在插入帖子的函数中,我计算可用记录,然后将它们加 1,如下所示:

    def create_post(title, content):
          Post(title=title, content=content, ID=Post.objects.count() + 1).save()
    

    【讨论】:

    • Mahmoud - 这不是正确的解决方案,它包含竞争条件,因此可能会失败。
    【解决方案3】:

    您可以使用mongoengine.signalspost_init 来自动增加字段。顺便说一句,还没有测试过。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多