我试图在mongodb中基于$聚合一个集合,其中试图从Log_Dir包含' / route_sanity /'的所有文档中获取聚合数据。在路径的某个地方。 令人惊讶的是,这个查询不适用于pymongo。 {请注意我正在使用用户的版本}
pipeline=[
{ '$match': { 'cgdvo_version' : version,'Dut_Name':'yvm','Log_Dir':{ '$in': ['/route_sanity/'] } } },
{ '$group': {
'_id':
'jid',
'PassVEVO': { '$sum': { '$cond' : [{ '$eq' : ['$Result', 'Pass']}, 1, 0]} },
'FailVEVO': { '$sum': { '$cond' : [{ '$eq' : ['$Result', 'Fail']}, 1, 0]} },
'ErrorVEVO': { '$sum': { '$cond' : [{ '$eq' : ['$Result', 'Error']}, 1, 0]} },
'TotalVEVO': { '$sum': 1 }
} },
{'$project':{'FailVEVO':1, 'PassVEVO':1,'ErrorVEVO':1,'TotalVEVO':1,'_id':0}}]
res= smokedb.command('aggregate','jid',pipeline=pipeline)
要交叉检查,以下查询在robomongo(mongodb客户端)
中正常工作db.getCollection('jid').find({cgdvo_version : 'pub-20150614.2',Dut_Name:'yvm',Log_Dir:{ $in: [/route_sanity/] }})
请帮忙!先谢谢。
答案 0 :(得分:0)
你在正则表达式周围有引号,这意味着它被解释为一个字符串。如果对您的语言语法有疑问,请改用$regex
BSON操作。但这里只使用re.compile
:
pipeline=[
{ '$match': {
'cgdvo_version' : version,
'Dut_Name':'yvm',
'Log_Dir':{
'$in': [re.compile('/route_sanity/')]
}
}},
{ '$group': {
'_id':
'jid',
'PassVEVO': { '$sum': { '$cond' : [{ '$eq' : ['$Result', 'Pass']}, 1, 0]} },
'FailVEVO': { '$sum': { '$cond' : [{ '$eq' : ['$Result', 'Fail']}, 1, 0]} },
'ErrorVEVO': { '$sum': { '$cond' : [{ '$eq' : ['$Result', 'Error']}, 1, 0]} },
'TotalVEVO': { '$sum': 1 }
}},
{'$project':{'FailVEVO':1, 'PassVEVO':1,'ErrorVEVO':1,'TotalVEVO':1,'_id':0}}
]
否则:
{ '$match': {
'cgdvo_version' : version,
'Dut_Name':'yvm',
'$or':[{ 'Log_Dir': { '$regex': 'route_sanity' }}]
}},
或者因为它们是正则表达式,有多个可能匹配,所以只需在那里使用OR |
操作
{ '$match': {
'cgdvo_version' : version,
'Dut_Name':'yvm',
'Log_Dir': { '$regex': 'route_sanity|something_else' }
}},
另请注意,您目前只有一个条件。这些方法允许您使用正则表达式指定多个条件。但如果你只需要一个,那就去做:
{ '$match': {
'cgdvo_version' : version,
'Dut_Name':'yvm',
'Log_Dir': { '$regex': 'route_sanity' }
}},