ключи сбора совокупности Pymongo - PullRequest
0 голосов
/ 26 июня 2018

Используя этот ответ здесь 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

1 Ответ

0 голосов
/ 11 июля 2018

Существует синтаксическая проблема с агрегатной командой:

db.collection.aggregate(pipeline)

должно быть

db[collection].aggregate(pipeline)
...