Используя этот ответ здесь https://stackoverflow.com/a/43570730/7626649
Я бы хотел сделать это с помощью колбы-пимонго.
В частности, я бы хотел выполнить приведенный ниже запрос в flask-pymongo и / или 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 с базой данных, которая содержит запрашиваемую коллекцию. Вот вывод db.command () с объяснением = True:
{ '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