$elemMatch 实例,嵌套查询

本文介绍了一种在MongoDB中实现复杂模糊查询的方法,通过构建特定的查询条件,结合正则表达式和$elemMatch操作符,实现了对指定字段的精确匹配及模糊搜索功能。
    @RequestMapping("/getExcelData.go")
    @ResponseBody
    public ExcelViewBean getRedisData(ExcelViewBean excelViewBean) {
        // randomKey
        String randomKey = "123456";
        // 行号
        Integer colNum = excelViewBean.getColNum();
        // 行号的值 value
        String colValue = excelViewBean.getColValue();
        // 条件集合,把多个and/or条件关联到一起
        BasicDBList condList = new BasicDBList();
        // 搜索条件 and或者or
        BasicDBObject searchCond = new BasicDBObject();
            // 条件1 randomKey 
            BasicDBObject query1 = new BasicDBObject();
            query1.put("randomKey", randomKey);
            condList.add(query1);
            
            // 条件2 模糊查询 value like pattern   start
            Pattern pattern = Pattern.compile("^.*" + colValue + ".*$", Pattern.CASE_INSENSITIVE);
            // 存放两个条件的 querySub
            BasicDBObject querySub = new BasicDBObject();
            querySub.put("value", pattern);
            querySub.put("colnum", colNum);
            // 条件2的组装,查询col 下的 colnum和value ,数据结果如下所示:
            BasicDBObject query2 = new BasicDBObject("col",new BasicDBObject("$elemMatch", querySub));
            condList.add(query2);
            // 两个条件 and 链接
            searchCond.put("$and", condList);
            // 条件2 模糊查询 value like pattern   end
            
            System.out.println("新建数据时候,模糊查询的条件3:" + searchCond);
            // 查询到的结果集,遍历结果集,可对数据操作
            findIterable = collection.find(searchCond).skip(pageStart).limit(5);
            Integer allRowNum = (int) collection.count(searchCond);
            System.out.println("查询的条件3总记录数:" + allRowNum);
            excelBean.setAllRowNum(allRowNum);
            
            
            
            ***************说明:生成的mongodb下shell查询条件如下
            { "$and" : [ { "randomKey" : "1_1533626469_test.xlsx"} , { "col" : { "$elemMatch" : { "value" : { "$regex" : "^.*3.*$" , "$options" : "i"} , "colnum" : 2}}}]}
            
            
            
            
            
            
            
            // 条件2 的另一个写法 start --------------------------------!!!不对,不要用了
            Pattern pattern = Pattern.compile("^.*" + colValue + ".*$", Pattern.CASE_INSENSITIVE);
            condList.add(new BasicDBObject("col", new BasicDBObject("$elemMatch",new BasicDBObject("value", pattern))));
            condList.add(new BasicDBObject("col", new BasicDBObject("$elemMatch",new BasicDBObject("colnum", colNum))));
            searchCond.put("$and", condList);
            // 条件2 的另一个写法 end 
            
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值