4

FlaskとMongoDBを使用してWebアプリケーションを開発しています。そして、(Flask-)MongoKitを使用して、データを検証するためのスキーマを定義します。

私のデータベースには、「email」フィールドを含む「users」(以下を参照)というコレクションがあります。MongoKitのドキュメント(http://namlook.github.com/mongokit/indexes.html)で指定されているように、そのフィールドに一意のインデックスを作成しようとしています。ただし、MongoDBクライアントシェルを介してコレクションインデックスを確認すると、インデックス「email」がまったくありません。

ネット上で同様の問題を見つけました:「一意のインデックスが機能しない」(https://github.com/namlook/mongokit/issues/98)

なぜそれが機能しないのか誰かが知っていますか?

ユーザーコレクション:

@db.register
class User(Model):

    __collection__ = 'users'

    structure = {
        'first_name': basestring,
        'last_name': basestring,
        'email': basestring,
        'password': unicode,
        'registration_date': datetime,
    }

    required_fields = ['first_name', 'last_name', 'email', 'password', 'registration_date']

    default_values = {
        'registration_date': datetime.utcnow,
    }

    # Create a unique index on the "email" field
    indexes = [
        {
            'fields': 'email',  # note: this may be an array
            'unique': True,     # only unique values are allowed 
            'ttl': 0,           # create index immediately
        },
    ]

db.users.getIndexes()出力:

[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "youthmind.users",
    "name" : "_id_"
},
]

'ttl':0なしでも試してみて、次のコードを使用してインデックスを作成できたことに注意してください。

db.users.create_index('email', unique=True)

これはpymongoConnectionオブジェクトを直接使用していると思います。

よろしくお願いします。

4

3 に答える 3

4

あなたはそれを行うべき方法を正確に行っています。自動インデックス作成は、バージョン 0.7.1 (おそらくバージョン 0.8?) で MongoKit から削除されました。 ここに問題があります。

その背後にある理由はensureIndex、コレクションを呼び出す必要があるためです。名前の「保証」部分は、インデックスが存在しない場合はインデックスをチェックして作成するように見えますが、Mongo の開発者は、インデックス全体を (再) 作成することになる可能性があると述べています。ひどく高価になる。開発者はまた、開発タスクではなく、管理タスクと見なされるべきであると述べました.

回避create_index策は、アップグレード/作成スクリプトの一部として定義したリスト内の各インデックスに対して自分自身を呼び出すことです。

于 2012-10-11T00:40:02.940 に答える
3

そうです、インデックスを使用してDBを再作成するには、別のスクリプトを使用する必要があります。サーバーが実行されるたびにではなく、必要に応じて呼び出されます。例:

def recreatedb(uri, database_name):
    connection = Connection(uri)
    connection.drop_database(database_name)
    #noinspection PyStatementEffect
    connection[database_name]
    connection.register(_DOCUMENTS)
    for document_name, obj in connection._registered_documents.iteritems():
        obj.generate_index(connection[database_name][obj._obj_class.__collection__])

インデックスなしでデータベースを使用しないようにするには:

def init_engine(uri, database_name):
    global db
    connection = Connection(uri)
    if database_name not in connection.database_names():
        recreatedb(uri, database_name)
    connection.register(_DOCUMENTS)
    db = connection[database_name]
于 2012-10-21T08:13:27.527 に答える
0

私は Flask-Script を使用しているので、実行しやすい管理スクリプトに Marboni の回答をコマンドとして追加するのは簡単でした。

@manager.command
def setup_indexes():
    """
    create index for all the registered_documents
    """
    for doc in application.db.registered_documents:
        collection = application.db[doc.__collection__]
        doc.generate_index(collection)

さまざまな管理用のアプリ (application.db) のメンバーとしてデータベースを保持しています。これで、インデックスをいくつか追加したり、何かを変更したりするたびに、マネージャー コマンドを実行します。

./manage.py setup_indexes

ここでマネージャーモジュールの詳細を読むことができます http://flask-script.readthedocs.org/en/latest/

于 2015-03-18T17:03:31.227 に答える