避免与pymongo一起工作的最简单方法是什么?我有一个非常简单的Location类结构(名称,段塞,描述和地理位置),我想确保不允许重复的名称。我正在使用烧瓶和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:在应用程序上下文之外工作。
答案 0 :(得分:4)
使用unique indexes并且您将没有两个文档具有相同的字段值。这不一定是特定于烧瓶的,但它具有特定的mongodb特性。
如果您懒惰或索引让您头痛,请使用_id
字段作为位置名称。在这种情况下,您必须确保您的文档不会被覆盖。
答案 1 :(得分: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 docs上查看有关此内容和pymongo的ensure_index
语法的详细信息。
答案 2 :(得分:0)
ensure_index 已为deprecated。改为使用 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)