python - 使用 python 进行动态 mongo 查询
问题描述
我有一个 mongo 聚合查询,我想根据一些 json 数据创建,所以查询将像动态的,它会根据 json 选择数组增长。
{
RuleResultSUmmaryByCategoryRequest:{
"topLevelFilterIds": [],
"category": "abc",
"selection": [{
"value": "value",
"category": "category"
}]
}
}
我的 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()
在这里,我需要在从 API 获取的 json 选择请求对象上使用循环,并为匹配和组生成动态阶段,我是 python 新手,所以任何人都可以帮助我在 python 中以动态方式编写它。
解决方案
我已经完成了动态查询,现在我可以创建一个动态 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)
如果有人可以帮助我进行优化或任何更好的方式来实现相同的目标,那将是很大的帮助。
推荐阅读
- mysql - 如何在 MySQL 中显示具有 2 种可能性的数据?
- c# - 将列表项添加到集合时,AddRange() 不起作用
- authentication - EMV 小程序(如 MasterCard 的 M/Chip 和 Visa 的 VSDC)与 POS 终端之间的相互认证
- java - 如何使用外观方法将实体转换为列表
- python - 当列值匹配时,Pandas Dataframe 从一行中替换 Nan
- python - type() 不能与 input() 一起使用并且总是返回“str” - Python 3.x
- ruby-on-rails - Rails 在 ajax 请求上闪烁(无需重新加载)
- rabbitmq - RabbitMq 中的高可用性和负载平衡
- javascript - 方法减少javascript
- java - 在sql server中创建表时如何锁定?