MongoDB使用string(hash)_id字段而不是整数;那么,如何获得经典id主键?每次创建类实例时都会增加一些变量吗?
class Post(Document):
authors_id = ListField(IntField(required=True), required=True)
content = StringField(max_length=100000, required=True)
id = IntField(required=True, primary_key=True)
def __init__(self):
//what next?
尝试创建新用户会引发异常:
mongoengine.queryset.OperationError: Tried to save duplicate unique keys
(E11000 duplicate key error index: test.user.$_types_1_username_1
dup key: { : "User", : "admin" })
代码:
user = User.create_user(username='admin', email='example@mail.com',
password='pass')
user.is_superuser = True
user.save()
为什么?
答案 0 :(得分:2)
您可以使用SequenceField
来提供此功能。但正如所述增加id不能很好地扩展,他们真的需要吗?你不能使用ObjectId
或slug吗?
答案 1 :(得分:1)
如果要使用递增的整数ID,请在此处描述执行此操作的方法:
http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field
对于不同的大型数据库/应用程序,这不会扩展,但适用于小型或中等应用程序。
答案 2 :(得分:0)
1)如果你真的想要这样做,你必须覆盖保存文档的mongoengine方法,使它找到一个具有最高id值的文档,并使用id + 1保存文档。这将产生开销(并且每次写入都会增加一次读取),因此我不鼓励您遵循此路径。您也可能有重复ID的问题(如果您在同一时间保存两个记录,您将读取最后一个ID的两倍 - 说1并保存两次id 1 + 1 = 2 =>这真的很糟糕 - 以避免这个问题你需要在每次插入时锁定整个集合,因为失去了表演。)
2)只是您无法使用相同的用户名保存多个用户(正如错误消息告诉您的那样) - 并且您已经拥有一个名为“admin”的用户。