Java ——MongDB 插入資料、 模糊查詢、in查詢

執筆記憶的空白發表於2018-08-10

由於需要用MongoDB快取資料,所以自己寫了一套公共的存放和讀取方法,具體如下:

 

存放mongodb:

/**
     * 公共方法:設定Object型別快取
     * @author shijing
     * @param param
     * @param sysGuid
     */
    public void setObjData(Map<String,Object> param, String sysGuid, String enumBpd){
        DBObject dbObject = new BasicDBObject();
        dbObject.putAll(param);
        String collectionName = EnumBpd.getBpdType(enumBpd) + sysGuid;
        mongoDao.insertToCol(dbObject,collectionName);
    }


    /**
     * 公共方法:設定List快取
     * @author shijing
     * @param paramList
     * @param sysGuid
     */
    public void setListData(List<Map<String,Object>> paramList, String sysGuid, String enumBpd){
        List<DBObject> list = new ArrayList<>();
        if(CollectionUtils.isNotNull(paramList)){
            for (Map<String,Object> param : paramList){
                DBObject dbObject = new BasicDBObject();
                dbObject.putAll(param);
                list.add(dbObject);
            }
        }
        String collectionName = EnumBpd.getBpdType(enumBpd) + sysGuid;
        mongoDao.insertToCol(list,collectionName);

 

mongoDao裡面的方法:

public void insertToCol(DBObject document, String collectionName) {
        dropCol(collectionName);
        DBCollection dbCollection = mongoTemplate.createCollection(collectionName);
        dbCollection.insert(document);
    }

    public void insertToCol(List<DBObject> documents, String collectionName) {
        dropCol(collectionName);
        DBCollection dbCollection = mongoTemplate.createCollection(collectionName);
        dbCollection.insert(documents);
    }

 

 

讀取方法

/**
     * 通過關鍵字模糊查詢問題和答案庫
     * @param param
     * @return
     */
    @Override
    public List<Map<String, Object>> searchQuestionAndAnswerByKeyword(Map<String, Object> param) {
        List<Map<String,Object>> searchList = new ArrayList<>();
        Map<String,Object> userInfo = SessionUtils.getUserInfo();
        String sysGuid = userInfo.get("sys_guid").toString();
        String collectionName = EnumBpd.getBpdType(EnumBpd.HELP_PAGE_LIST.getType())+sysGuid;
        //註釋裡面這種方式雖然能模糊查詢,但是容易漏掉資料,切記切記!!!
        //Pattern pattern = Pattern.compile("^.*" + param.get("keyword") +".*$", Pattern.CASE_INSENSITIVE);
        BasicDBObject query=  new BasicDBObject();
        //模糊查詢的欄位設定
        query.put("page_html", Pattern.compile((String) param.get("keyword")));
        DBCursor dbCursor =  mongoDao.findAll(query,collectionName);
        List<DBObject> list = dbCursor.toArray();
        for (DBObject dbObject: list){
            searchList.add(dbObject.toMap());
        }

        //模糊查到的資料進行組裝
        return getQuestionAndAnswerList(searchList);
    }

    /**
     * 公共方法:批量—— in方法查詢List資料
     * @author shijing
     * @param ids  id集合
     * @param paramMap 其他引數
     * @param columnName  in欄位列名
     * @param collectionName 表名
     * @return
     */
    @Override
    public List<Map<String, Object>> batchSearchPageListByIds(List<String> ids, Map<String,
            Object> paramMap, String columnName, String collectionName) {
        List<Map<String,Object>> searchList = new ArrayList<>();
        BasicDBObject query=  new BasicDBObject();
        //批量查詢,in
        if (CollectionUtils.isNotEmpty(ids)){
            BasicDBList values = new BasicDBList();
            values.addAll(ids);
            query.put(columnName, new BasicDBObject("$in",values));
        }
        //拼接引數
        if(MapUtils.isNotEmpty(paramMap)){
            for (String mapKey: paramMap.keySet()){
                query.put(mapKey, paramMap.get(mapKey));
            }
        }
        DBCursor dbCursor =  mongoDao.findAll(query,collectionName);
        List<DBObject> list = dbCursor.toArray();
        if (dbCursor!=null && dbCursor.size()>0){
            for (DBObject dbObject: list){
                searchList.add(dbObject.toMap());
            }
        }
        return searchList;
    }

    /**
     * 公共方法:通過引數獲取List資料
     * @author shijing
     * @param paramMap  引數
     * @param collectionName   表名
     * @return
     */
    @Override
    public List<Map<String, Object>> getListByParam(Map<String, Object> paramMap,String collectionName){
        List<Map<String,Object>> searchList = new ArrayList<>();
        BasicDBObject query=  new BasicDBObject();
        //拼接引數
        if(MapUtils.isNotEmpty(paramMap)){
            for (String mapKey: paramMap.keySet()){
                query.put(mapKey, paramMap.get(mapKey));
            }
        }
        DBCursor dbCursor =  mongoDao.findAll(query,collectionName);
        List<DBObject> list = dbCursor.toArray();
        if (dbCursor!=null && dbCursor.size()>0){
            for (DBObject dbObject: list){
                searchList.add(dbObject.toMap());
            }
        }
        return searchList;
    }

    /**
     * 公共方法:通過引數獲取Object資料
     * @author shijing
     * @param paramMap
     * @param collectionName  表名
     * @return
     */
    @Override
    public Map<String, Object> getObjectByParam(Map<String, Object> paramMap, String collectionName) {
        Map<String,Object> webSiteInfo = new HashMap<>();
        BasicDBObject query=  new BasicDBObject();
        //拼接引數
        if(MapUtils.isNotEmpty(paramMap)){
            for (String mapKey: paramMap.keySet()){
                query.put(mapKey, paramMap.get(mapKey));
            }
        }
        DBObject dbObject =  mongoDao.findOne(query,collectionName);
        if(dbObject!=null){
            return dbObject.toMap();
        }
        return webSiteInfo;
    }

注意事項:

mongodb模糊查詢時,Pattern pattern = Pattern.compile("^.*" + param.get("keyword") +".*$", 這種方式存在bug, 容易漏掉資料

應該使用下面這種方式:

query.put("page_html", Pattern.compile((String) param.get("keyword")));

先記錄到這吧,有需要在補充,批量in方法也在上述程式碼裡面。

 

 

 

 

相關文章