Python MongoDB执行查询

我有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的类的实例。

Robert1973 回答:Python MongoDB执行查询

您的聚合管道需要设置为阶段列表。因此,使用方括号来表示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"} 
    }
}
])
,

我认为这里有两个问题 1.我们需要使用@Mahesh Nayak建议的方括号将聚合管道定义为阶段

mongo_query = db.transacciones.aggregate([
{
    $project : 
    { 
        month : {$month : "$day"},pr_total_amount_approved : {$sum : "$pr_total_amount_approved"} 
    }
}])
  1. 第二个函数问题,您正在传递集合名称和查询,但已经查询了mongodb游标。

您必须按如下所示修改查询

query = [
{
    $project : 
    { 
        month : {$month : "$day"},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
,

由于Mahesh NayakAnil Kumar Gupta,我为函数 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]

但是这种方式目前不起作用。

本文链接:https://www.f2er.com/3147595.html

大家都在问