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代わりに または slugを使用できませんか?

于 2012-06-23T21:39:35.787 に答える
1

増加する整数 ID を使用する場合、その方法は次のとおりです。

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

これは、さまざまな大規模な DB/アプリには対応しませんが、小規模または中規模のアプリケーションではうまく機能します。

于 2012-06-23T19:10:13.957 に答える
0

1)本当にやりたい場合は、ドキュメントを保存するmongoengineメソッドをオーバーライドして、idの最大値を持つ1つのドキュメントを探し、そのid + 1を使用してドキュメントを保存する必要があります。これによりオーバーヘッド (および書き込みごとに 1 つの追加読み取り) が発生するため、この方法に従うことはお勧めしません。ID の重複の問題も発生する可能性があります (2 つのレコードを同時に保存すると、最後の ID を 2 回読み取ることになります。1 と言って、ID を 2 回保存します。1+1 = 2 => これは非常に悪いことです。これを回避するには、パフォーマンスを失うことにより、挿入のたびにコレクション全体をロックする必要がある問題)。

2)同じユーザー名で複数のユーザーを保存することはできません(エラーメッセージが示すように)-そして、すでに「admin」というユーザーがいます。

于 2012-06-23T15:13:43.297 に答える