java 中 mongodb的各類操做 模糊查詢 精確查詢 等等

本意是想查查mongo數據庫的int類型的like怎麼查,可是好像沒 解決這個問題。javascript

精確查詢;模糊查詢;分頁查詢,每頁多少:按某個字段排序(或升或降):查詢數量:大於,小於,等於;且,或,某個字段不爲空,某個字段不存在,查詢在某個範圍內,刪除等等查詢。java

 

一. 經常使用查詢:mysql

1. 查詢一條數據:(多用於保存時判斷db中是否已有當前數據,這裏 is  精確匹配,模糊匹配 使用regex...)sql

 

[javascript] view plain copymongodb

 在CODE上查看代碼片派生到個人代碼片

  1. public PageUrl getByUrl(String url) {  
  2.         return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class);  
  3.     }  

 

2. 查詢多條數據:linkUrl.id 屬於分級查詢數據庫

 

[javascript] view plain copy數據結構

 在CODE上查看代碼片派生到個人代碼片

  1. public List<PageUrl> getPageUrlsByUrl(int begin, int end,String linkUrlid) {          
  2.         Query query = new Query();  
  3.         query.addCriteria(Criteria.where("linkUrl.id").is(linkUrlid));  
  4.         return find(query.limit(end - begin).skip(begin), PageUrl.class);          
  5.     }  

 

3.模糊查詢:-----關鍵字---regexapp

 

[javascript] view plain copythis

 在CODE上查看代碼片派生到個人代碼片

  1. public long getProcessLandLogsCount(List<Condition> conditions)  
  2.     {  
  3.         Query query = new Query();  
  4.         if (conditions != null && conditions.size() > 0) {  
  5.             for (Condition condition : conditions) {  
  6.                 query.addCriteria(Criteria.where(condition.getKey()).regex(".*?\\" +condition.getValue().toString()+ ".*"));  
  7.             }  
  8.         }  
  9.         return count(query, ProcessLandLog.class);  
  10.     }  

最下面,我在代碼親自實踐過的模糊查詢,只支持字段屬性是字符串的查詢,你要是查字段屬性是int的模糊查詢,還真沒轍。url

 

4.gte: 大於等於,lte小於等於...注意查詢的時候各個字段的類型要和mongodb中數據類型一致

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. public List<ProcessLandLog> getProcessLandLogs(int begin,int end,List<Condition> conditions,String orderField,Direction direction)  
  2.     {  
  3.         Query query = new Query();  
  4.         if (conditions != null && conditions.size() > 0) {  
  5.             for (Condition condition : conditions) {  
  6.                 if(condition.getKey().equals("time")){  
  7.                     query.addCriteria(Criteria.where("time").gte(condition.getValue())); //gte: 大於等於  
  8.                 }else if(condition.getKey().equals("insertTime")){  
  9.                     query.addCriteria(Criteria.where("insertTime").gte(condition.getValue()));  
  10.                 }else{  
  11.                     query.addCriteria(Criteria.where(condition.getKey()).is(condition.getValue()));  
  12.                 }  
  13.             }  
  14.         }  
  15.         return find(query.limit(end - begin).skip(begin).with(new Sort(new Sort.Order(direction, orderField))), ProcessLandLog.class);  
  16.     }  
  17.   
  18. public List<DpsLand> getDpsLandsByTime(int begin, int end, Date beginDate,Date endDate) {  
  19.   return find(new Query(Criteria.where("updateTime").gte(beginDate).lte(endDate)).limit(end - begin).skip(begin),  
  20.     DpsLand.class);  
  21.  }  

 

查詢字段不存在的數據 -----關鍵字---not

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. public List<GoodsDetail> getGoodsDetails2(int begin, int end) {  
  2.         Query query = new Query();  
  3.         query.addCriteria(Criteria.where("goodsSummary").not());  
  4.         return find(query.limit(end - begin).skip(begin),GoodsDetail.class);  
  5.     }  

 

查詢字段不爲空的數據     -----關鍵字---ne

 

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. Criteria.where("key1").ne("").ne(null)  

 

查詢或語句:a || b     ----- 關鍵字---orOperator

 

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. Criteria criteria = new Criteria();  
  2. criteria.orOperator(Criteria.where("key1").is("0"),Criteria.where("key1").is(null));  


查詢且語句:a && b     ----- 關鍵字---and

 

 

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. Criteria criteria = new Criteria();  
  2. criteria.and("key1").is(false);  
  3. criteria.and("key2").is(type);  
  4. Query query = new Query(criteria);  
  5. long totalCount = this.mongoTemplate.count(query, Xxx.class);  

 

 

查詢一個屬性的子屬性,例如:查下面數據的key2.keyA的語句

 

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1.    var s = {  
  2.        key1: value1,  
  3.        key2: {  
  4.            keyA: valueA,  
  5.            keyB: valueB  
  6.        }  
  7.    };  
  8.   
  9. @Query("{'key2.keyA':?0}")  
  10. List<Asset> findAllBykeyA(String keyA);  

 

 

5. 查詢數量:----- 關鍵字---count

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. public long getPageInfosCount(List<Condition> conditions) {  
  2.         Query query = new Query();  
  3.         if (conditions != null && conditions.size() > 0) {  
  4.             for (Condition condition : conditions) {  
  5.                 query.addCriteria(Criteria.where(condition.getKey()).is(condition.getValue()));  
  6.             }  
  7.         }  
  8.         return count(query, PageInfo.class);  
  9.     }  

 

查找包含在某個集合範圍:----- 關鍵字---in

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. Criteria criteria = new Criteria();  
  2. Object [] o = new Object[]{0, 1, 2}; //包含全部  
  3. criteria.and("type").in(o);  
  4. Query query = new Query(criteria);  
  5. query.with(new Sort(new Sort.Order(Direction.ASC, "type"))).with(new Sort(new Sort.Order(Direction.ASC, "title")));  
  6. List<WidgetMonitor> list = this.mongoTemplate.find(query, WidgetMonitor.class);  

 

 

6. 更新一條數據的一個字段:

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. public WriteResult updateTime(PageUrl pageUrl) {  
  2.         String id = pageUrl.getId();  
  3.         return updateFirst(new Query(Criteria.where("id").is(id)),Update.update("updateTime", pageUrl.getUpdateTime()), PageUrl.class);  
  4.     }  

 

7. 更新一條數據的多個字段:

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. //調用更新  
  2. private void updateProcessLandLog(ProcessLandLog processLandLog,  
  3.             int crawlResult) {  
  4.         List<String> fields = new ArrayList<String>();  
  5.         List<Object> values = new ArrayList<Object>();  
  6.         fields.add("state");  
  7.         fields.add("result");  
  8.         fields.add("time");  
  9.         values.add("1");  
  10.         values.add(crawlResult);  
  11.         values.add(Calendar.getInstance().getTime());  
  12.         processLandLogReposity.updateProcessLandLog(processLandLog, fields,  
  13.                 values);  
  14.     }  
  15. //更新  
  16. public void updateProcessLandLog(ProcessLandLog land, List<String> fields,List<Object> values) {  
  17.         Update update = new Update();  
  18.         int size = fields.size();  
  19.         for(int i = 0 ; i < size; i++){  
  20.             String field = fields.get(i);  
  21.             Object value = values.get(i);  
  22.             update.set(field, value);  
  23.         }  
  24.         updateFirst(new Query(Criteria.where("id").is(land.getId())), update,ProcessLandLog.class);  
  25.     }  

 

8. 刪除數據:

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. public void deleteObject(Class<T> clazz,String id) {  
  2.         remove(new Query(Criteria.where("id").is(id)),clazz);  
  3.     }  

 

9.保存數據:

 

[javascript] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. //插入一條數據  
  2. public void saveObject(Object obj) {  
  3.         insert(obj);  
  4.     }  
  5.   
  6. //插入多條數據      
  7. public void saveObjects(List<T> objects) {  
  8.         for(T t:objects){  
  9.             insert(t);  
  10.         }  
  11.     }  

 

我本身使用的例子:

下面例子涉及到:
精確查詢:is;
模糊查詢:regex;
分頁查詢,每頁多少:skip,limit
按某個字段排序(或升或降):new Sort(new Sort.Order(Sort.Direction.ASC, "port"))
查詢數量:count

 

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. public Map<String, Object> getAppPortDetailByPage(int pageNo, int pageSize, String order, String sortBy, String appPortType, String appPortSeacherName) {  
  2.     Criteria criteria = new Criteria();  
  3.     if (!appPortType.equals("")) {  
  4.         if (!appPortType.equals("all")) {  
  5.             //DB表裏的字段----appmanageType  
  6.             //下同 port protocol 也是DB表的字段  
  7.             criteria.and("appmanageType").is(appPortType);  
  8.         }  
  9.     }  
  10.     if (!appPortSeacherName.equals("")) {  
  11.         try {  
  12.             criteria.orOperator(Criteria.where("port").is(Integer.parseInt(appPortSeacherName)),  
  13.                     Criteria.where("protocol").regex(".*?" + appPortSeacherName + ".*"));  
  14.         }catch (Exception e){  
  15.             criteria.orOperator(Criteria.where("protocol").regex(".*?" + appPortSeacherName + ".*"));  
  16.         }  
  17.     }  
  18.     Map<String, Object> result = Maps.newHashMap();  
  19.     Query query = new Query(criteria);  
  20.     query.skip((pageNo - 1) * pageSize);  
  21.     query.limit(pageSize);  
  22.     if(order != null && sortBy != null){  
  23.         query.with(new Sort(new Sort.Order(order.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sortBy)));  
  24.     }else {  
  25.         query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "port")));  
  26.     }  
  27.     List<Appportmanage> list = this.mongoTemplate.find(query, Appportmanage.class);  
  28.     long count = this.mongoTemplate.count(query, Appportmanage.class);  
  29.     result.put("datas", list);  
  30.     result.put("size", count);  
  31.     return result;  
  32. }  

 

 

mongo數據庫裏面像搜索數據類型爲int的字段,

而後想使用like語句來着,可是沒有實現,

由於個人port端口存的事int屬性,

可是在列表頁面,要支持字段搜索的話,而後個人int類型的端口字段,就不支持搜索了,

而後就考慮,既然是端口,那就是一個固定的,惟一的,

爲何要支持like語句呢?

你搜索端口號是1的就搜出來的是1的端口號就對了,而不是1,11,21,,,等等都個搜索出來,

因此,

對去其餘的字符串 類型的字段,你使用like語句搜索,

我是沒意見的,

要是非得 實現int類型的like搜索,

我 也不知道啊。

只有改數據結構

讓int型變成string型的話,

就能夠like搜索啦。

相關文章
相關標籤/搜索