5

pymongoでフィールド衝突を回避する最も簡単な方法は何ですか? Location クラス (名前、スラッグ、説明、地理位置情報) の構造は非常に単純で、重複した名前が許可されないようにしたいと考えています。フラスコとピモンゴを使用していますか?

私はこれを試していました:

from flask import Flask

from flask.ext.pymongo import PyMongo


app = Flask(__name__)

mongo = PyMongo(app)

mongo.db.court.ensureIndex( { "name": 1, "slug": 1 } )

しかし、それは私にエラーを与えます: RuntimeError: working outside of application context.

4

3 に答える 3

4

一意のインデックスを使用すると、フィールドに同じ値を持つドキュメントが 2 つなくなります。これはフラスコ固有である必要はありませんが、mongodb 固有です。

あなたが怠け者だったり、インデックスが頭痛の種だったりする場合は、_idフィールドを場所の名前として使用してください。この場合、ドキュメントが上書きされないようにする必要があります。

于 2013-09-17T20:32:57.320 に答える
4

呼び出しを行うのに最適な場所は、flask アプリensure_indexを呼び出す前の場所です。run()リクエストにサービスを提供する前に、インデックスが適切に配置されていることを確認する必要があります。これは、サイトが稼働中にインデックスを構築すると、サイトがかなり応答しなくなるためです。取得しているエラーは、アプリケーション コンテキストが必要なためです。試す:

app = Flask(__name__)
mongo = PyMongo(app)
if __name__ == '__main__':
    with app.app_context():
        mongo.db.court.ensure_index( [("name", ASCENDING), ("slug", ASCENDING)], unique=True )
    app.run()

@thkangが言ったように、一意のインデックスを使用して、2つのドキュメントがフィールドまたはフィールドのセットに対して同じ値を持たないようにする必要があります。ensure_indexこれと pymongo の構文の詳細については、 pymongo docsを参照してください。

于 2013-09-18T00:16:13.330 に答える