如何使用带有Pymongo的正则表达式的$ in

时间:2015-08-05 18:08:53

标签: regex mongodb mongodb-query pymongo

我试图在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/] }})

请帮忙!先谢谢。

1 个答案:

答案 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' }
   }},

这样就无需$in$or

另请注意,您目前只有一个条件。这些方法允许您使用正则表达式指定多个条件。但如果你只需要一个,那就去做:

   { '$match': { 
       'cgdvo_version' : version,
       'Dut_Name':'yvm',
       'Log_Dir': { '$regex': 'route_sanity' }
   }},
相关问题