在flask中修改MongoDB数据

时间:2015-02-06 11:43:03

标签: python mongodb d3.js

我正在运行一个从mongo DB获取数据的烧录服务器。

from flask import Flask
from flask import render_template
from pymongo import Connection
import json
from bson import json_util
from bson.json_util import dumps

app = Flask(__name__)

MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017
DBS_NAME = 'donorschoose'
COLLECTION_NAME = 'projects'
FIELDS = {'school_state': True, 'resource_type': True, 'poverty_level': True, 'date_posted': True, 'total_donations': True, '_id': False}

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/donorschoose/projects")
def donorschoose_projects():
    connection = Connection(MONGODB_HOST, MONGODB_PORT)
    collection = connection[DBS_NAME][COLLECTION_NAME]
    projects = collection.find(fields=FIELDS)
    json_projects = []
    for project in projects:
        json_projects.append(project)
    json_projects = json.dumps(json_projects, default=json_util.default)
    connection.disconnect()
    return json_projects

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=5000,debug=True)

我从网上获得了这个代码并成功实现了它。并通过此应用程序将数据提供给d3应用程序。我的问题是:是否可以使用python在烧瓶环境中修改数据? (在我上面粘贴的代码中?)。我只是问,因为我在d3中的专业知识较少,因此python将允许比d3更大的灵活性。问题:“贫困水平”栏目将有4个固定值,即低,中,高,未知。 我的目标是计算高贫困水平的百分比  即对于列'poor_level' - > count(val = high)/ count(所有行)

基本上我只需要一列来显示我的指标,我很难做到这一点是d3。任何d3或python级别的帮助将非常感激:)

谢谢。

1 个答案:

答案 0 :(得分:2)

首先,您需要完全迭代find()返回的Cursor:

projects = list(collection.find(fields=FIELDS))

然后计算高贫困项目的总数和数量:

high_poverty_count = len(p for p in projects if p['poverty_level'] == 'high')
high_poverty_ratio = float(high_poverty_count) / len(projects)

然后我将它与所有项目的列表一起添加为文档:

result = {'high_poverty_ratio': high_poverty_ratio,
          'projects': projects}

return json.dumps(result, default=json_util.default)

另请注意,您的应用程序存在两个严重问题:

首先,您使用" Connection",即obsolete。这样做:

from pymongo import MongoClient

client = MongoClient(MONGODB_HOST, MONGODB_PORT)

其次,您创建一个新客户端并为每个请求断开连接。这非常慢。相反,在应用程序开始时创建客户端,永远不要断开它:

client = MongoClient(MONGODB_HOST, MONGODB_PORT)

@app.route("/donorschoose/projects")
def donorschoose_projects():
    collection = client[DBS_NAME][COLLECTION_NAME]
    # ... etc ....
    return json.dumps(result, default=json_util.default)