pymongo 聚合集合键
pymongo aggregate collection keys
在这里使用这个答案
我想用 flask-pymongo 做这个。
具体来说,我想在 flask-pymongo and/or pymongo 中执行以下查询(似乎如果它可以在一个中完成,那么它也可以在另一个中完成..我希望):
db.things.aggregate([
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
{"$unwind":"$arrayofkeyvalue"},
{"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
])
这是我到目前为止所做的:
@app.route('/reports/<site>/<system>/<data_type>', methods=['GET'])
def get_keys_for_collection(site, system, data_type):
pipeline = [
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
{"$unwind":"$arrayofkeyvalue"},
{"$group":{"_id": None,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
]
db, options = get_db_handle(site)
collection = "%s_%s" % (system, data_type)
pp.pprint(db.command('aggregate', collection, pipeline=pipeline, explain=True))
return jsonify({'results': list(db.collection.aggregate(pipeline))})
我已经验证 'db' 是一个活动的 Flask-Pymongo 连接到包含被查询集合的数据库。这是带有 explain=True 的 db.command() 的输出:
{ 'ok': 1.0,
'stages': [ { '$cursor': { 'query': {},
'queryPlanner': { 'indexFilterSet': False,
'namespace': 'MYDB.collection',
'parsedQuery': {},
'plannerVersion': 1,
'rejectedPlans': [],
'winningPlan': { 'direction': 'forward',
'stage': 'COLLSCAN'}}}},
{ '$project': { '_id': True,
'arrayofkeyvalue': { '$objectToArray': [ '$$ROOT']}}},
{'$unwind': {'path': '$arrayofkeyvalue'}},
{ '$group': { '_id': {'$const': None},
'allkeys': { '$addToSet': '$arrayofkeyvalue.k'}}}]}
我省略了实际的数据库和集合名称,并用上面的MYDB.collection替换了它们。 db.command() 证明 db.connection 是一个有效的连接,问题不在于查询那部分的语法。
结果是一个空列表,没有错误。 URL 已修改为不显示某些信息。查看 db.command() 结果以证明数据库连接和集合存在并且正在正确连接。
curl http://0.0.0.0:5000/reports/site/system/data_type
{
"results": []
}
我在用什么:
Python 3.6.5
MongoDB shell version v3.6.5
PyMongo v3.4.0
Flask-Pymongo v0.5.2
聚合命令存在语法问题:
db.collection.aggregate(pipeline)
应该是
db[collection].aggregate(pipeline)
在这里使用这个答案
我想用 flask-pymongo 做这个。
具体来说,我想在 flask-pymongo and/or pymongo 中执行以下查询(似乎如果它可以在一个中完成,那么它也可以在另一个中完成..我希望):
db.things.aggregate([
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
{"$unwind":"$arrayofkeyvalue"},
{"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
])
这是我到目前为止所做的:
@app.route('/reports/<site>/<system>/<data_type>', methods=['GET'])
def get_keys_for_collection(site, system, data_type):
pipeline = [
{"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
{"$unwind":"$arrayofkeyvalue"},
{"$group":{"_id": None,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
]
db, options = get_db_handle(site)
collection = "%s_%s" % (system, data_type)
pp.pprint(db.command('aggregate', collection, pipeline=pipeline, explain=True))
return jsonify({'results': list(db.collection.aggregate(pipeline))})
我已经验证 'db' 是一个活动的 Flask-Pymongo 连接到包含被查询集合的数据库。这是带有 explain=True 的 db.command() 的输出:
{ 'ok': 1.0,
'stages': [ { '$cursor': { 'query': {},
'queryPlanner': { 'indexFilterSet': False,
'namespace': 'MYDB.collection',
'parsedQuery': {},
'plannerVersion': 1,
'rejectedPlans': [],
'winningPlan': { 'direction': 'forward',
'stage': 'COLLSCAN'}}}},
{ '$project': { '_id': True,
'arrayofkeyvalue': { '$objectToArray': [ '$$ROOT']}}},
{'$unwind': {'path': '$arrayofkeyvalue'}},
{ '$group': { '_id': {'$const': None},
'allkeys': { '$addToSet': '$arrayofkeyvalue.k'}}}]}
我省略了实际的数据库和集合名称,并用上面的MYDB.collection替换了它们。 db.command() 证明 db.connection 是一个有效的连接,问题不在于查询那部分的语法。
结果是一个空列表,没有错误。 URL 已修改为不显示某些信息。查看 db.command() 结果以证明数据库连接和集合存在并且正在正确连接。
curl http://0.0.0.0:5000/reports/site/system/data_type
{
"results": []
}
我在用什么:
Python 3.6.5
MongoDB shell version v3.6.5
PyMongo v3.4.0
Flask-Pymongo v0.5.2
聚合命令存在语法问题:
db.collection.aggregate(pipeline)
应该是
db[collection].aggregate(pipeline)