Python MongoDB выполнить запрос - PullRequest
1 голос
/ 07 ноября 2019

У меня есть запрос к MongoDB:

mongo_query = db.transacciones.aggregate( 
{
    $project : 
    { 
        month : {$month : "$day"}, 
        year : {$year :  "$day"},
        pr_avg_rate : 1,
        pr_avg_rate_approved : 1,
        pr_numbers : 1,
        pr_numbers_approved : 1,
        pr_total_amount : 1,
        pr_total_amount_approved : 1      
    }
}, 
{
    $group : { 
        _id : {month : "$month" ,year : "$year" },
        pr_avg_rate : {$avg : "$pr_avg_rate"},
        pr_avg_rate_approved : {$avg : "$pr_avg_rate_approved"},
        pr_numbers : {$sum : "$pr_numbers"},
        pr_numbers_approved : {$sum : "$pr_numbers_approved"},
        pr_total_amount : {$sum : "$pr_total_amount"},
        pr_total_amount_approved : {$sum : "$pr_total_amount_approved"} 
    }
})

, и я пытаюсь выполнить с помощью Pymongo, но не работает, и ошибка:

Error: connection not established pipeline must be a list

Функция, котораясделать работу:

def execute_agregation(self, query, collection_name):
    result = None
    try:
        collection = self._instance.db[collection_name]
        result = collection.aggregate(query)
        print(result)
    except Exception as error:
        print('Error: connection not established {}'.format(error))
        return None
    else:
        return result

, которая вызывается с помощью следующей инструкции:

result = mongo_conn.execute_agregation(mongo_query, "transacciones")

mongo_conn является экземпляром класса с именем Mongo.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2019

Я думаю, что здесь у нас есть две проблемы 1. Нам нужно определить агрегатный конвейер на этапы, используя квадратную скобку, как предложено @Mahesh Nayak

mongo_query = db.transacciones.aggregate([
{
    $project : 
    { 
        month : {$month : "$day"}, 
        year : {$year :  "$day"},
        pr_avg_rate : 1,
        pr_avg_rate_approved : 1,
        pr_numbers : 1,
        pr_numbers_approved : 1,
        pr_total_amount : 1,
        pr_total_amount_approved : 1      
    }
}, 
{
    $group : { 
        _id : {month : "$month" ,year : "$year" },
        pr_avg_rate : {$avg : "$pr_avg_rate"},
        pr_avg_rate_approved : {$avg : "$pr_avg_rate_approved"},
        pr_numbers : {$sum : "$pr_numbers"},
        pr_numbers_approved : {$sum : "$pr_numbers_approved"},
        pr_total_amount : {$sum : "$pr_total_amount"},
        pr_total_amount_approved : {$sum : "$pr_total_amount_approved"} 
    }
}])
Вторая проблема с функцией: вы передаете имя коллекции и запрос, но запрашиваете уже курсор mongodb.

, либо вам нужно изменить запрос, как показано ниже

query = [
{
    $project : 
    { 
        month : {$month : "$day"}, 
        year : {$year :  "$day"},
        pr_avg_rate : 1,
        pr_avg_rate_approved : 1,
        pr_numbers : 1,
        pr_numbers_approved : 1,
        pr_total_amount : 1,
        pr_total_amount_approved : 1      
    }
}, 
{
    $group : { 
        _id : {month : "$month" ,year : "$year" },
        pr_avg_rate : {$avg : "$pr_avg_rate"},
        pr_avg_rate_approved : {$avg : "$pr_avg_rate_approved"},
        pr_numbers : {$sum : "$pr_numbers"},
        pr_numbers_approved : {$sum : "$pr_numbers_approved"},
        pr_total_amount : {$sum : "$pr_total_amount"},
        pr_total_amount_approved : {$sum : "$pr_total_amount_approved"} 
    }
}]

#Or modify your function as below 
def execute_agregation(self, query):
    result = None
    try:
        result = query
        print(result)
    except Exception as error:
        print('Error: connection not established {}'.format(error))
        return None
    else:
        return result
0 голосов
/ 07 ноября 2019

Благодаря Махешу Наяку и Анилу Кумару Гупте я получил приблизительное решение для функции execute_agregation :

def execute_agregation(self, query, collection_name):
    result = None
    try:
        collection = self._instance.db[collection_name]
        pipeline = [
            {
                "$project" : 
                { 
                    "month" : {"$month" : "$day"}, 
                    "year" : {"$year" :  "$day"},
                    "pr_avg_rate" : 1,
                    "pr_avg_rate_approved" : 1,
                    "pr_numbers" : 1,
                    "pr_numbers_approved" : 1,
                    "pr_total_amount" : 1,
                    "pr_total_amount_approved" : 1      
                }
            }, 
            {
                "$group" : { 
                    "_id" : {"month" : "$month" ,"year" : "$year" },
                    "pr_avg_rate" : {"$avg" : "$pr_avg_rate"},
                    "pr_avg_rate_approved" : {"$avg" : "$pr_avg_rate_approved"},
                    "pr_numbers" : {"$sum" : "$pr_numbers"},
                    "pr_numbers_approved" : {"$sum" : "$pr_numbers_approved"},
                    "pr_total_amount" : {"$sum" : "$pr_total_amount"},
                    "pr_total_amount_approved" : {"$sum" : "$pr_total_amount_approved"} 
                }
            }
        ]
        # print(pipeline)
        result = collection.aggregate(pipeline)
        # print(result)
    except Exception as error:
        print('Error: connection not established {}'.format(error))
        return None
    else:
        return result

НоТеперь я пытаюсь использовать переменную с именем query, которая представляет собой строку со следующей структурой:

"{'$project': {'month': {'$month': '$day'}, 'year': {'$year': '$day'}, 'pr_avg_rate': 1, 'pr_avg_rate_approved': 1, 'pr_numbers': 1, 'pr_numbers_approved': 1, 'pr_total_amount': 1, 'pr_total_amount_approved': 1}}, {'$group': {'_id': {'month': '$month', 'year': '$year'}, 'pr_avg_rate': {'$avg': '$pr_avg_rate'}, 'pr_avg_rate_approved': {'$avg': '$pr_avg_rate_approved'}, 'pr_numbers': {'$sum': '$pr_numbers'}, 'pr_numbers_approved': {'$sum': '$pr_numbers_approved'}, 'pr_total_amount': {'$sum': '$pr_total_amount'}, 'pr_total_amount_approved': {'$sum': '$pr_total_amount_approved'}}}"

И я хочу поместить запрос в массив конвейера, как

pipeline = [query]

но это не работает прямо сейчас, на этом пути.

0 голосов
/ 07 ноября 2019

Ваш конвейер агрегации должен быть настроен как список этапов. Так что используйте квадратные скобки для обозначения массивов в JSON.

mongo_query = db.transacciones.aggregate([ 
{
    $project : 
    { 
        month : {$month : "$day"}, 
        year : {$year :  "$day"},
        pr_avg_rate : 1,
        pr_avg_rate_approved : 1,
        pr_numbers : 1,
        pr_numbers_approved : 1,
        pr_total_amount : 1,
        pr_total_amount_approved : 1      
    }
}, 
{
    $group : { 
        _id : {month : "$month" ,year : "$year" },
        pr_avg_rate : {$avg : "$pr_avg_rate"},
        pr_avg_rate_approved : {$avg : "$pr_avg_rate_approved"},
        pr_numbers : {$sum : "$pr_numbers"},
        pr_numbers_approved : {$sum : "$pr_numbers_approved"},
        pr_total_amount : {$sum : "$pr_total_amount"},
        pr_total_amount_approved : {$sum : "$pr_total_amount_approved"} 
    }
}
])
...