Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MongoEngine自动增量_Python_Mongodb_Mongoengine - Fatal编程技术网

Python MongoEngine自动增量

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

我正在用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
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中唯一也是最好的自动增量实现。