5

使用 pymongo 避免现场冲突的最简单方法是什么?我有一个非常简单的 Location 类结构(名称、slug、描述和地理位置),我想确保不允许重复的名称。我正在使用烧瓶和 pymongo?

我正在尝试这个:

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:在应用程序上下文之外工作。

4

3 回答 3

4

使用唯一索引,您将不会有两个文档具有相同的字段值。这不一定是特定于烧瓶的,但它是特定于 mongodb 的。

如果您很懒惰或索引让您头疼,只需使用_id字段作为位置名称。在这种情况下,您必须确保您的文档不会被覆盖。

于 2013-09-17T20:32:57.320 回答
4

拨打电话的最佳地点是在您调用烧瓶应用程序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 所说,您应该使用唯一索引来强制没有两个文档对于一个字段或一组字段具有相同的值。在pymongo 文档中查看更多关于这个和 pymongo 的ensure_index语法。

于 2013-09-18T00:16:13.330 回答
3

ensure_index已被弃用。请改用create_index

from flask import Flask
from flask_pymongo import PyMongo
import pymongo

app = Flask(__name__)
mongo = PyMongo(app)

with app.app_context():
    mongo.db.court.create_index([("name", pymongo.ASCENDING), ("slug", pymongo.ASCENDING)], unique=True)
于 2018-12-28T16:51:01.883 回答