0
  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" })
    

代码:

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

为什么?

4

3 回答 3

2

您可以使用它SequenceField来提供此功能。但如前所述,增加 id 不能很好地扩展,它们真的需要吗?你不能使用ObjectId或代替蛞蝓吗?

于 2012-06-23T21:39:35.787 回答
1

如果您想使用递增的整数 ID,执行此操作的方法如下所述:

http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

这不适用于各种大型数据库/应用程序,但它适用于小型或中型应用程序。

于 2012-06-23T19:10:13.957 回答
0

1)如果你真的想这样做,你必须覆盖保存文档的 mongoengine 方法,使其查找具有最高 id 值的文档并使用该 id+1 保存文档。这将产生开销(并且每次写入都会额外读取一次),因此我不鼓励您遵循此路径。您还可能遇到重复 ID 的问题(如果您同时保存两条记录,您将读取最后一个 id 两次 - 比如说 1 并保存两次 id 1+1 = 2 => 这真的很糟糕 - 避免这种情况问题你需要在每次插入时锁定整个集合,通过失去性能)。

2)您不能使用相同的用户名保存多个用户(正如错误消息告诉您的那样) - 而且您已经有一个名为“admin”的用户。

于 2012-06-23T15:13:43.297 回答