简体   繁体   English

使用 python 的动态 mongo 查询

[英]Dynamic mongo query with python

I have a mongo aggregation query that i want to create on the basis of some json data, So the query will be like dynamic and it will grow as per json selection array.我有一个 mongo 聚合查询,我想在一些 json 数据的基础上创建,所以查询将像动态的,它将根据 json 选择数组增长。

{ 
 RuleResultSUmmaryByCategoryRequest:{
      "topLevelFilterIds": [],
      "category": "abc",
      "selection": [{
        "value": "value",
        "category": "category"
      }]
    }
}

my mongo aggregate query is like我的 mongo 聚合查询就像

db.rule_execution_result.aggregate([{
   $match: {
       $and: [{
               'topLevelFilter.id': {
                   $in: ['5fd1bd7868d7ac4e211a7642']
               }
           },
           {
               'ruleCategory': 'test'
           }
       ]
   }
},
{
   $group: {
       _id: {
           ruleCategory: '$ruleCategory',
           topLevelFilter: '$topLevelFilter.id'
       },
       name: {
           $first: '$topLevelFilter.name'
       },
       type: {
           $first: '$topLevelFilter.type'
       },
       fail: {
           $sum: {
               $cond: [{
                   $eq: ['$summaryStatus', 0]
               }, 1, 0]
           }
       }
   }
},
{
   $group: {
       _id: '$_id.ruleCategory',
       fail: {
           $sum: '$fail'
       },
       portfolio: {
           $push: {
               id: '$_id.topLevelFilter',
               name: '$name',
               type: '$type',
               fail: '$fail'
           }
       }
   }
},
{
   $group: {
       _id: 0,
       result: {
           $push: {
               category: '$_id',
               fail: '$fail',
               portfolio: '$portfolio'
           }
       },
       fail: {
           $sum: '$fail'
       }
   }
},
{
   $project: {
       _id: 0,
       data: '$result',
       total: {
           fail: '$fail'
       }
   }
}
]).pretty()

Here i need to use loop on json selection request object that i am getting from API and genrate dynamic stages for match and group, I am new in python so can any one help me to write it in dynamic way in python. Here i need to use loop on json selection request object that i am getting from API and genrate dynamic stages for match and group, I am new in python so can any one help me to write it in dynamic way in python.

I am done with dynamic query and now i am able to create a dynamic mongo aggregate query.我已经完成了动态查询,现在我可以创建一个动态 mongo 聚合查询。

pipeline = []

matches = {}
matches["$and"]=[]
matches["$and"].append({ "topLevelFilter.id": { "$in": request_data["topLevelFilterIds"]}})
for x in request_data['Filter']:
  matches["$and"].append({x['category']: x['value']})
pipeline.append({'$match': matches})
  
first_stage_grouping = {}
first_stage_grouping = {'_id': {'groupByColumn': '$' + request_data['category'],
                                'topLevelFilter': '$topLevelFilter.id'}}
first_stage_grouping['name'] = {'$first': '$topLevelFilter.name'}
first_stage_grouping['type'] = {'$first': '$topLevelFilter.type'}
first_stage_grouping['fail'] = {
    '$sum': {'$cond': [{'$eq': ['$summaryStatus', 0]}, 1, 0]}}
first_stage_grouping['pass'] = {
    '$sum': {'$cond': [{'$eq': ['$summaryStatus', 1]}, 1, 0]}}
first_stage_grouping['warn'] = {
    '$sum': {'$cond': [{'$eq': ['$summaryStatus', 2]}, 1, 0]}}
pipeline.append({'$group': first_stage_grouping})

second_stage_grouping = {}
second_stage_grouping = {'_id': '$_id.groupByColumn'}
second_stage_grouping['fail'] = {'$sum': '$fail'}
second_stage_grouping['pass'] = {'$sum': '$pass'}
second_stage_grouping['warn'] = {'$sum': '$warn'}
second_stage_grouping['portfolio'] = {'$push': {'id': '$_id.topLevelFilter',
                                                'name': '$name', 'type': '$type', 'fail': '$fail', 'pass': '$pass', 'warn': '$warn'}}
pipeline.append({'$group': second_stage_grouping})

third_stage_grouping = {}
third_stage_grouping = {'_id': 0}
third_stage_grouping['result'] = {'$push': {
    'category': '$_id', 'fail': '$fail', 'pass': '$pass', 'warn': '$warn', 'portfolio': '$portfolio'}}
third_stage_grouping['fail'] = {'$sum': '$fail'}
third_stage_grouping['pass'] = {'$sum': '$pass'}
third_stage_grouping['warn'] = {'$sum': '$warn'}
pipeline.append({'$group': third_stage_grouping})

projection = {}
projection = {'_id': 0, 'data': '$result', 'total': {
    'fail': '$fail', 'pass': '$pass', 'warn': '$warn'}}
pipeline.append({'$project': projection})
print(pipeline)

If anyone can help me to optimize or any better way to achive the same, it will be great help.如果有人可以帮助我进行优化或任何更好的方式来实现相同的目标,那将是很大的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM