Flask pymongo中的唯一字段

Flask pymongo中的唯一字段,flask,pymongo,Flask,Pymongo,使用pymongo避免场碰撞的最简单方法是什么?对于Location类(name、slug、description和geolocation),我有一个非常简单的结构,我希望确保不允许有重复的名称。我用的是烧瓶和pymongo 我试着这样做: from flask import Flask from flask.ext.pymongo import PyMongo app = Flask(__name__) mongo = PyMongo(app) mongo.db.court.ensu

使用pymongo避免场碰撞的最简单方法是什么?对于Location类(name、slug、description和geolocation),我有一个非常简单的结构,我希望确保不允许有重复的名称。我用的是烧瓶和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:在应用程序上下文之外工作。

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


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

在您的flask应用程序上调用
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的
确保索引
语法的更多信息,请参见。

确保索引已被删除。改用


我不理解这一点,谢谢,我知道这是mongo特有的,但我想直接在烧瓶中进行,因为我不想使用mongoengine或mongokit这样的ORM。基本上,我想完全避免模型,只使用视图函数,直接通过pymongo插入。我的问题是我应该把这个索引放在哪里code@freethrow更新数据库不需要
flask pymongo
。它们的存在是为了减少在请求时管理数据库连接的痛苦。直接使用
pymongo
,您将不需要任何上下文。这正是我想要的!
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)