Python MongoDB执行查询

Python MongoDB执行查询,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有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_numb

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

您的聚合管道需要设置为一个阶段列表。因此,在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"} 
    }
}
])

需要将聚合管道设置为阶段列表。因此,在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"}, 
        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
    

    我认为这里有两个问题 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
    
    由于和,我得到了函数执行\u agregion的近似解:

    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]
    
    但是它现在不起作用,在这种情况下。

    多亏了和,我得到了函数的近似解执行\u agregion

    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]
    
    但是现在不行,就这样