Mongoengine整数id和用户创建

时间:2012-06-23 14:56:48

标签: python django mongodb mongoengine nosql

  1. 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?
    
  2. 尝试创建新用户会引发异常:

    mongoengine.queryset.OperationError: Tried to save duplicate unique keys 
    (E11000 duplicate key error index: test.user.$_types_1_username_1
     dup key: { : "User", : "admin" })
    
  3. 代码:

    user = User.create_user(username='admin', email='example@mail.com',
                            password='pass')
    user.is_superuser = True
    user.save()
    

    为什么?

3 个答案:

答案 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”的用户。