Python MongoEngine自动增量
我正在用Flask和MongoEngine开发一个博客引擎,我的帖子需要顺序ID 我需要MongoEngine为每个新帖子创建一个新ID,所以我想做如下事情:Python MongoEngine自动增量,python,mongodb,mongoengine,Python,Mongodb,Mongoengine,我正在用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 clas
class Post(Document):
title = StringField(required=True)
content = StringField(required=True)
published_at = datetime.utcnow()
id = Post.objects.count() + 1
class Post(Document):
title = StringField(required=True)
content = StringField(required=True)
published_at = datetime.utcnow()
ID = IntField(min_value=1)
这样行吗?有更好的方法吗?编辑:这是一个不正确的解决方案,正如其他人指出的那样,这种方法会导致竞争条件。我把它放在这里只是为了让其他人知道为什么这样不好。(多个客户端可以访问同一对象并对其进行递增,从而导致不一致的结果)
旧答案: 我想出来了
Post
类如下所示:
class Post(Document):
title = StringField(required=True)
content = StringField(required=True)
published_at = datetime.utcnow()
id = Post.objects.count() + 1
class Post(Document):
title = StringField(required=True)
content = StringField(required=True)
published_at = datetime.utcnow()
ID = IntField(min_value=1)
在插入post的函数中,我计算可用记录,然后按1递增,如下所示:
def create_post(title, content):
Post(title=title, content=content, ID=Post.objects.count() + 1).save()
首先,您需要了解为什么需要增量id?它们解决了什么问题 mongoDB中没有本机解决方案-请阅读: 既然你已经有了一个带有帖子的
pk
的唯一标识符,为什么不使用它呢
最后,如果我没有劝阻您不要做傻事的话,mongoengine中有一个
SequenceField
,可以为您处理递增操作 Mahmoud-这不是正确的解决方案,它包含竞争条件,因此很容易失败。我希望帖子和用户都有增量ID,自动生成的ID不适合在URL中使用,这就是我想创建自己的URL的原因。当然,您可以创建人类可读的slug,这样也可以提高URL的可访问性。SequenceField
是Mongoengine中唯一也是最好的自动增量实现。