mongodb的join($lookup)后根据从表的字段过滤
百度的都是根据主表的字段过滤,下面的是我亲测有效的
但是注意 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<BasicDBObject> ret = mongoTemplate.aggregate(aggregation,"car_info",BasicDBObject.class);