mongodb的join($lookup)后根据从表的字段过滤

     百度的都是根据主表的字段过滤,下面的是我亲测有效的

mongodb的join($lookup)后根据从表的字段过滤_第1张图片

 但是注意 match一定要写到lookup后面 好像是因为pipeline模式 具体什么意思我也不知道 参考linux的管道模式

附上Mongotemplate的代码

LookupOperation lookupAgg =
        Aggregation.lookup("charge_data","charge_id","_id","inventory_docs");
Criteria criteria = Criteria.where("parking_id").in(parkIds);
//过滤inventory_docs为空
criteria.and("inventory_docs").size(1);
if(!"".equals(car_no)&&car_no!=null){
    criteria.and("car_no").regex(".*"+car_no+".*");
}
if(!"".equals(user_name)&&user_name!=null){
    criteria.and("user_name").regex(".*"+user_name+".*");
}
if(!"".equals(user_mobile)&&user_mobile!=null){
    criteria.and("user_mobile").regex(".*"+user_mobile+".*");
}
if(!"".equals(billcharge_end)&&billcharge_end!=null){
    criteria.and("inventory_docs.billcharge_end").regex(".*"+billcharge_end+".*");
}
if(!"".equals(fix_card_value)&&fix_card_value!=null){
    criteria.and("inventory_docs.fix_card_value").is(fix_card_value);
}else {
    criteria.and("inventory_docs.fix_card_value").ne(0);
}
MatchOperation matchOperation = Aggregation.match(criteria);
//lookupAgg一定要在matchOperation的前面 两者顺序颠倒就过滤不了
Aggregation aggregation
        = Aggregation.newAggregation(lookupAgg,matchOperation);
AggregationResults ret
        = mongoTemplate.aggregate(aggregation,"car_info",BasicDBObject.class);

你可能感兴趣的:(mongo)