1. 程式人生 > >java操作mongdb多條件複合查詢(包括模糊查詢和按時間段查詢),分頁

java操作mongdb多條件複合查詢(包括模糊查詢和按時間段查詢),分頁

最近學了下mongdb,在這兒先和大家分享一下java操作mongdb的多條件查詢,包括模糊查詢,完全匹配查詢和按時間段查詢,以及分頁。

MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.springframework.dao.DataAccessException;
import com.channelsoft.portal.pushlog.dao.IPushLogDao;
import com.channelsoft.portal.pushlog.po.PushLogPo;
import com.channelsoft.xgPushServer.push.util.MongoUtil;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
/** 
* @author zhaocd 
* @date:2015年12月23日 上午11:32:24 
*/
public class PushLogDaoImpl implements IPushLogDao {

	@Override
	public List<PushLogPo> query(PushLogPo po, int rows, int page) throws DataAccessException {
		List<PushLogPo> list = new ArrayList<PushLogPo>();//儲存資料的list
		DBCollection newsCollection = MongoUtil.getDB().getCollection("push_log");//獲得mongdb資料庫的連線
		BasicDBList condList = new BasicDBList();//存放查詢條件的集合
		BasicDBObject searchQuery = new BasicDBObject();//條件查詢的物件
		Pattern pattern;//用在模糊查詢得時候,對欄位進行匹配
		if(StringUtils.isNotBlank(po.getTitle())){//模糊查詢
			pattern = Pattern.compile("^.*"+po.getTitle()+".*$", Pattern.CASE_INSENSITIVE);
			searchQuery.put("title",pattern);
			condList.add(searchQuery);//將這個查詢條件放到條件集合中
		}
		if(StringUtils.isNotBlank(po.getSendId())){//精確匹配
			 searchQuery.put("send_id",""+po.getSendId()+"");
			 condList.add(searchQuery);//將這個查詢條件放到條件集合中
		}
		if(StringUtils.isNotBlank(po.getUserIds())){//精確匹配
			 searchQuery.put("user_ids",""+po.getUserIds()+"");
			 condList.add(searchQuery);//將這個查詢條件放到條件集合中
		}
		if(StringUtils.isNotBlank(po.getPushType())){//精確匹配
			 searchQuery.put("push_type",""+po.getPushType()+"");
			 condList.add(searchQuery);//將這個查詢條件放到條件集合中
		}
		if(StringUtils.isNotBlank(po.getMessageType())){//精確匹配
			searchQuery.put("message_type",""+po.getMessageType()+"");
			 condList.add(searchQuery);//將這個查詢條件放到條件集合中
		}
		//查詢某個時間段
		searchQuery.put("create_time", BasicDBObjectBuilder.start("$gte", po.getStartTime()+" 00:00:00").add("$lte", po.getEndTime()+" 23:59:59").get());
		condList.add(searchQuery);//將這個查詢條件放到條件集合中

		DBCursor cursor;//對查詢結果的接受
		BasicDBObject condition= new BasicDBObject();//最後在將查詢結果放到一個查詢物件中去
		condition.put("$and", condList);//多條件查詢使用and
		//這兒的  .skip((page - 1) * rows).limit(rows)  就是分頁查詢,skip()中的引數是從第多少條記錄開始,limit()中的引數是一次查詢多少條
		cursor = newsCollection.find(condition).skip((page - 1) * rows).limit(rows);
		po.setTotalPage(newsCollection.find(condition).count());//得到所有的符合條件的資料,用於前端顯示共有多少頁
		while (cursor.hasNext())
		{
			PushLogPo plog = new PushLogPo();
			DBObject DBObject = cursor.next();
			@SuppressWarnings("unchecked")
			Map<String, Object> map = (Map<String, Object>) DBObject.toMap();
			if(map.size() > 0){//對結果集的匹配
				plog.setSequence(String.valueOf(map.get("sequence")));
				plog.setSendId(String.valueOf(map.get("send_id")));
				plog.setUserIds(String.valueOf(map.get("user_ids")));
				plog.setTitle(String.valueOf(map.get("title")));
				plog.setContent(String.valueOf(map.get("content")));
				plog.setPushType(String.valueOf(map.get("push_type")));
				plog.setMessageType(String.valueOf(map.get("message_type")));
				plog.setPushResult(String.valueOf(map.get("push_result")));
				plog.setPushResult(String.valueOf(map.get("push_result")));
				plog.setPushResultCode(String.valueOf(map.get("push_result_code")));
				plog.setPushCount(String.valueOf(map.get("push_count")));
				plog.setCreateTime(String.valueOf(map.get("create_time")));
				plog.setUpdateTime(String.valueOf(map.get("update_time")));
				list.add(plog);
			}
		}
		return list;
	}
}

IPushLogDao類是自己定義的介面,在這就不展示了。

注意:在這我需要說明一下mongdb中的時間格式,之前我做入庫的時候,時間入庫直接是new Date()這種方式,這樣入庫以後在資料庫中看時間格式的時候是這樣的"create_time" : ISODate("2015-12-24T07:43:19.167Z") ,然後我在按條件查詢得時候發現查詢出來的時間格式又是這樣的create_time=Thu Dec 24 15:43:19 CST 2015 ,第一個想法就是對這個時間格式進行轉換,但那樣就不能按時間段來查詢了,所以最後就更改了時間入庫的格式,把之前的new Date()改成

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    sdf.format(new Date())  這樣之後,你就會發現資料庫中的時間顯示的格式也變了"create_time" : "2015-12-28 10:09:58" ,就沒有isodate那個標誌了,這樣這樣查詢出來的時間就沒問題了,就可以直接按照時間段來查詢了。

相關推薦

java操作mongdb條件複合查詢(包括模糊查詢時間段查詢)

最近學了下mongdb,在這兒先和大家分享一下java操作mongdb的多條件查詢,包括模糊查詢,完全匹配查詢和按時間段查詢,以及分頁。 MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,

SpringData jpa 實現條件動態查詢功能

問題由來: 剛開始使用springdata的時候,只會用findByName這樣的簡單查詢,這樣寫dao層確實非常的快,但是在我們做篩選功能的時候,這樣的查詢似乎很難滿足我們的需求,但是都已經用上的springdata又不想再去寫mybatis這樣在xml裡面判

java操作mongdb 各種情況的增刪該查

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

java不確定條件篩選

最近在做一個專案涉及到了一個多表、多條件、不確定篩選的功能,在這裡和大家分享一下。 首先,我所使用的是SSH框架,多年的專案經驗和麵向物件思維的引導,我對Hibernate情有獨鍾; 其次,業務需求是要實現周邊店鋪的查詢,查詢的條件包括城市、縣區、街道、周邊距離、是否有優惠券、人均消費、網紅、老字號、新店

介紹 複雜查詢包括表關聯排序等

本篇進行Spring-data-jpa的介紹,幾乎涵蓋該框架的所有方面,在日常的開發當中,基本上能滿足所有需求。這裡不講解JPA和Spring-data-jpa單獨使用,所有的內容都是在和Spring整合的環境中實現。如果需要了解該框架的入門,百度一下,很多入門的介紹。在這篇文章的接下來一篇,會有一個

spring-data-jpa 介紹 複雜查詢包括表關聯排序

本篇進行Spring-data-jpa的介紹,幾乎涵蓋該框架的所有方面,在日常的開發當中,基本上能滿足所有需求。這裡不講解JPA和Spring-data-jpa單獨使用,所有的內容都是在和Spring整合的環境中實現。如果需要了解該框架的入門,百度一下,很多入門的介紹。在這篇

Java鏈接HBASE數據庫創建一個表刪除一張表修改表輸出插入修改數據刪除數據獲取顯示表信息過濾查詢查詢地理hash

can charat nfa true 目錄結構 dfa byte sin extra 準備工作 1、創建Java的Maven項目 創建好的目錄結構如下: 另外註意junit的版本,最好不要太高,最開始筆者使用的junit4.12的,發現運行的時候會報錯。最後把Junit

Oracle數據庫(三)表操作連接查詢

enc 解決辦法 oracl 主鍵 con sequence tno 插入 通過 復制表 --復制表 create table new_table as select * from Product --復制表結構不要數據 create table new

SQL筆記二:過濾條件欄位個取值、模糊匹配兩個值之間取值、去重

上一節簡單的總結了單表查詢和多表查詢,以下給大家總結了查詢語句的結構,如下: SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY...LIMIT... 本節主要總結下常用的條件欄位的匹配問題,最常見的是“=”,如select * from studen

pg資料庫查詢(inner)級聯查詢

一、資料庫的多表連線查詢,inner的不同用法在pg資料庫中建立兩張表:t_a和t_b如下所示:t_a:t_b:1、inner join(內連線)inner join就是根據on欄位標示出來的條件,查詢關聯的表中符合條件的資料,並把他前部都顯示出來,形成一個結果集。執行如下語

java中子類初始化流程(包括靜態區非靜態區)

一. 類中的方法分為例項方法和類方法兩種,用static修飾的是類方法。二者有什麼區別呢? 例項方法:        當類的位元組碼檔案被載入到記憶體時,類的例項方法不會被分配入口地址,當該類建立物

91---Criteria的內連結查詢唯一物件條件查詢分組統計投影查詢DetachedCriteria

================Criteria分頁加動態查詢方法====================================== public PageInfo<Auction> select(Auction condition, int pageIndex){DetachedC

Java連線HBASE資料庫建立一個表刪除一張表修改表輸出插入修改資料刪除資料獲取顯示錶資訊過濾查詢查詢地理hash

準備工作 1、建立Java的Maven專案 建立好的目錄結構如下: 另外注意junit的版本,最好不要太高,最開始筆者使用的junit4.12的,發現執行的時候會報錯。最後把Junit的版本改成4.7的之後,問題解決了。 編寫POM檔案 <

sql server 時間段查詢

解決方法 轉換成 保存 日期類 會有 查詢 日期 etime arc 百度的資料,保存下來: 在寫按時間段查詢的sql語句的時候 一般我們會這麽寫查詢條件:   where date>=‘2010-01-01‘ and date<=‘2010-10-1‘。 但是

HQL(動態查詢查詢)

分頁查詢 div set 回話 from ber tor string onf 動態查詢 Session session; Transaction tx;@Before public void mybefor() { //1構建配置對象COnfigurat

高級查詢

mit 當前 urn one com .get .com 高級查詢 rri 高級查詢,分頁: 1:service層: 代碼: 1 @Override 2 public QueryLimitPageObj queryLimitPage(ProductQu

關於python操作mysqlpostgresql資料庫的sql 限制語句sql語法問題

@本人使用django開發一個數據庫的管理模組,主要開發兩種資料庫的管理,遇到了一些坑 Python 使用psycopg2操作postgresql ,使用pymysql連線mysql psycopg2 下載 pip install psycopg2 pymysq

Mysql主鍵 UUID做主鍵自增主鍵及字串主鍵在插入、查詢等效能

1.插入方面 UUID做主鍵,其他欄位相同,插入100萬條資料,用了3.5個小時 自增主鍵,其他欄位相同,插入相同的100萬條資料,用了16分鐘 有序增長的字串做主鍵,其他欄位相同,插入相同100萬條資料,用了7分鐘 2.查詢方面 UUID做主鍵,select count() fro

金蝶EAS查詢分析器查詢獲取6500行之後的記錄

由於金蝶EAS系統中,查詢分析器預設單次最多返回6500行資料,如需在查詢分析器中檢視6500行之後的資料時,需要進行分頁查詢; 分頁查詢時,先寫出查詢語句,該查詢語句包含所有結果記錄,可以將結果集看做臨時表(表名為t); 然後將結果集作按照特定欄位排序(order by t

MongoDB資料查詢排序

MongoDB資料查詢 資料準備:persons.json var persons = [{ name:"jim", age:25, email:"[email protected]", c:89,m:96,e:87,