mongoTemplate通過Query條件指定查詢條件和返回欄位
一.簡介
Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的CRUD的操作,上一篇我們介紹了對MongoDB的新增和刪除, 今天我們要介紹Java程式碼實現對MongoDB實現查詢操作。
我們回顧一下,我們在之前介紹了MongoDB的基本文件查詢,MongoDB的查詢語法:
db.orders.find({{<field1>:<value1>,<field2>: <value2>, ... } },{field1:<boolean>, field2: <boolean> ... })
我們介紹是SpringData MongoDB 提供了find方法,方便我們通過java程式碼實現對MongoDB的查詢操作:
mongoTemplate.find (query, entityClass)
引數說明:
entityClass:實體class,也就是要把文件轉換成對應的實體。
query查詢語句的實現的方式有兩種:
1.org.springframework.data.mongodb.core.query
建構函式
Query (Criteria criteria)
接受的引數是org.springframework.data.mongodb.core.query.Criteria
Criteria是標準查詢的介面,可以引用靜態的Criteria.where的把多個條件組合在一起,就可以輕鬆地將多個方法標準和查詢連線起來,方便我們操作查詢語句。
例如: 查詢條件onumber="002"
mongoTemplate.find (new Query(Criteria.where("onumber").is("002")),entityClass)
多個條件組合查詢時:
例如:onumber="002" and cname="zcy"
mongoTemplate.find (new Query(Criteria.where("onumber").is("002").and("cname").is("zcy")),entityClass)
例如:onumber="002" or cname="zcy"
mongoTemplate.findOne(newQuery(newCriteria().orOperator(Criteria.where("onumber").is("002"),Criteria.where("cname").is("zcy"))),entityClass);
我們通過Criteria的and方法,把這個條件組合一起查詢
Criteria提供了很多方法,我們這邊先介紹基本文件的查詢操作符,對於陣列文件或者內嵌文件的操作符,我們下一篇在介紹。
Criteria |
Mongodb |
說明 |
Criteria and (String key) |
$and |
並且 |
Criteria andOperator (Criteria… criteria) |
$and |
並且 |
Criteria orOperator (Criteria… criteria) |
$or |
或者 |
Criteria gt (Object o) |
$gt |
大於 |
Criteria gte (Object o) |
$gte |
大於等於 |
Criteria in (Object… o) |
$in |
包含 |
Criteria is (Object o) |
$is |
等於 |
Criteria lt (Object o) |
$lt |
小於 |
Criteria lte (Object o) |
$lte |
小等於 |
Criteria nin (Object… o) |
$nin |
不包含 |
。。。。。。。。。。。。。。 |
2、子類 org.springframework.data.mongodb.core.query.BasicQuery
構造方法
BasicQuery(DBObject queryObject)
BasicQuery(DBObject queryObject, DBObject fieldsObject)
BasicQuery(java.lang.String query)
BasicQuery(java.lang.String query, java.lang.String fields)
DBObject就是轉換成JSON格式,提供了我們回顧一下,MongoDB查詢時,
db.collection.find(query,projection),query型別是document,所以,我們想使用JSON字串查詢時,我們使用DBObject建立查詢例項。
DBObject是介面,提供了幾個子類,
我們比較經常使用的比較底層子類,擴充套件了自己的方法和繼承父類,所以功能會比較多。
1. BasicDBObject
BasicBSONObject extendsLinkedHashMap<String,Object> implements BSONObject
BasicDBObject extends BasicBSONObject implementsDBObject
例如:查詢條件onumber="002"
DBObject obj = new BasicDBObject();
obj.put( "onumber","002" );
相當於
db.collect.find({"onumber":"002"})
2. BasicDBList
BasicBSONList extendsArrayList<Object> implements BSONObject
BasicDBList extends BasicBSONList implements DBObject
BasicDBList可以存放多個BasicDBObject條件
例如:我們查詢onumber=002OR cname=zcy1
BasicDBList basicDBList=new BasicDBList();
basicDBList.add(new BasicDBObject("onumber","002"));
basicDBList.add(new BasicDBObject("cname","zcy1"));
DBObjectobj =newBasicDBObject();
obj.put("$or", basicDBList);
Query query=new BasicQuery(obj);
相當於
db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})
basicDBList.add方法是新增一個文件的查詢條件
3. com.mongodb. QueryBuilder
QueryBuilder預設建構函式,是初始化BasicDBObject,QueryBuilder多個方法標準和查詢連線起來,方便我們操作查詢語句。跟Criteria是標準查詢的介面一樣,
QueryBuilder和BasicDBObject配合使用
QueryBuilder幫我們實現了 $and等操作符,我們檢視部分的原始碼:QueryBuilder部分的原始碼:
- publicclassQueryBuilder {
- /**
- * Creates a builder with an empty query
- */
- publicQueryBuilder() {
- _query = new BasicDBObject();
- }
- publicQueryBuilder or( DBObject ... ors ){
- List l = (List)_query.get( "$or" );
- if ( l == null ){
- l = new ArrayList();
- _query.put( "$or" , l );
- }
- for ( DBObject o : ors )
- l.add( o );
- returnthis;
- }
- /**
- * Equivalent to an $and operand
- * @param ands
- * @return
- */
- @SuppressWarnings("unchecked")
- publicQueryBuilder and( DBObject ... ands ){
- List l = (List)_query.get( "$and" );
- if ( l == null ){
- l = new ArrayList();
- _query.put( "$and" , l );
- }
- for ( DBObject o : ands )
- l.add( o );
- returnthis;
- }
接下來我們介紹查詢的實現,Criteria提供了很多方法,我們這邊就不在一個一個的操作符執行一遍,這跟學習MongoDB 四: MongoDB查詢(一)基本文件的操作符介紹的一樣。
二.findOne查詢
findOne返回滿足指定查詢條件的文件,如果多個文件滿足查詢,該方法返回第一個文件,根據自然順序返回檔案在磁碟上的順序,在覆蓋的集合中,自然順序與插入順序相同。如果沒找到對應的文件,會返回null。
方法:
mongoTemplate.findOne(query,entityClass)
1. 介紹介面以及方法的實現
我們在上一篇有介紹了實現基本的新增,對整個結構有介紹了,我們這邊就不在介紹了,直接介紹往裡面新增方法
第一步:我們在基礎介面MongoBase.java類新增一個findOne的介面
- //根據條件查詢
- blic T findOne(Query query,String collectionName);
- @Override
- ublic Orders findOne(Query query, String collectionName) {
- return mongoTemplate.findOne(query, Orders.class, collectionName);
第三步:實現測試方法
- /測試testFindOne方法新增
-
相關推薦
mongoTemplate通過Query條件指定查詢條件和返回欄位
一.簡介 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的CRUD的操作,上一篇我們介紹了對MongoDB的新增和刪除, 今天
elasticsearch中的綜合查詢 (指定返回欄位, 過濾條件、排序、每頁展示條數)
{ "_source": ["write_date"], "query":{"match_all": {}}, "sort": [ { "datedb": { "order": "desc" } } ], "from"
利用es-head 刪除指定查詢條件中的資料
在head中的複合查詢中選擇DELETE 引數用_query 例如刪除type 為gz_xx某個特定時間內的資料 http://xxx.xx.xxx.xx:9200/yuyinsearch-2016.01/gz_xx/ 引數為_query 請求體為: { "query"
SpringData通過@Query註解支援JPA語句和原生SQL語句
在SpringData中們可是使用繼承介面直接按照規則寫方法名即可完成查詢的方法,不需要寫具體的實現,但是這樣寫又是不能滿足我們的需求,比如子查詢,SpringData中提供了@Query註解可以讓我們寫JPA的語句和原生的SQL語句,那接下來看看怎麼寫JPA的查詢語句和原生
C#查詢ACCESS資料庫欄位和時間欄位
查詢表的所有欄位 string.Format("SELECT * FROM{0}", TableName); 查詢表中的一個欄位 在ACCESS中將欄位用CStr()轉換成字串來判斷 string.Format("SELECT* FROM {0} WHERE CStr({1})=
Oracle觸發器條件更改新插入記錄的欄位值
最近,有個專案功能需要在Oracle資料庫中對錶的記錄做動態更新,實現一插入指定條件的記錄,就修改相關欄位值。嘗試了下,最終做到每當插入時就能夠更新記錄某欄位值。 這裡用PL/SQL做了相關實現。 相關表名稱為Person ,其屬性欄位如下: 具體需求為:當插入記錄年齡(欄位A
剛剛釋出 logstash通過webhdfs放入hdfs增加時間戳和host欄位
1.問題描述 logstash通過webhdfs外掛把資料放入hdfs的時候,發現每行資料的簽名都增加了一個時間戳和host欄位 2018-12-19T08:30:30.234Z %{host} "128.1.1.2" "GET" #2.資料查詢 在網上找了很多資料,描述的都是
C# 如何獲取SQL Server 中指定資料表的所有欄位名和欄位型別
如何獲取指定資料表的所有欄位名和欄位型別。SqlConnection.GetSchema方法有2個過載形式,獲取指定資料表的所有欄位名和欄位型別的祕密就在GetSchema (String, String[])的第二個引數中。 定義如下: public override DataTable GetS
YII2 多表關聯ar查詢副表某欄位和
一對多 a表 id status 1 1 b表 id income aid 1 1000 1 2 &nb
Oracle資料庫裡面查詢字串型別的欄位不為空和為空的SQL語句:
摘要:近期專案中,在做高階查詢的時候有個條件是根據選擇的欄位,然後再選擇欄位的值為空和不為空做查詢,在寫SQL語句的時候費了很長時間,現在記錄一下,方便日後檢視: 一:查詢字串型別的欄位的值不為空的S
查詢資料庫的 sql語句 返回欄位 和類 屬性的關係
資料庫的資料表 實體類 package exer; public class Student { //流水號 private int flowId; //考試的型別 private int type; //身份證號 private String idCa
查詢sql server 2005 欄位名稱和註釋
SELECT 表名 = CASE WHEN A.COLORDER=1 THEN D.NAME ELSE ' ' END,表備註 = CASE WHEN A.COLORDER=1
sqlserver中用不重複的條件更新兩個表對應欄位欄位。
表T1和表T2,表T2的F23欄位用表T1的F3欄位更新,條件是T1.F2=T2.F22並且只有T1.F2和T2.F22是一一對應,T1只有一條記錄和T2對應,例子如下: create table t1(f1 int,f2 varchar(10),f3 varchar(1
oracle資料庫查詢某個表的欄位資訊
(1)查詢整個資料庫所有表的欄位 select t.column_name from user_col_comments t;(一般建議去執行,因為資料庫表過多執行起來會非常的慢) (2)查詢特定表名的表字段 select t.column_name, t.column_name&nbs
sql中連線多個結果集查詢符合要求的欄位
1.sql中將查詢到的結果集作為一個表去連線多個結果集查詢想要的欄位,適用於查詢複雜邏輯的欄位; 舉例: select dd.base_grade_value,count(distinct dd.userid) from (select cc.school_id,bb.us
檢視當前mysql的指定庫的指定表的所有列欄位
-- 檢視當前mysql的所有資料庫 select * from INFORMATION_SCHEMA.SCHEMATA; -- 檢視當前mysql的指定庫的指定表的所有列 select * from INFORMATION_SCHEMA.COLUMNS wher
通過javax.validation.constraints下的註解實現欄位驗證
@NotNull 使用該註解的欄位的值不能為null,否則驗證無法通過。 實體類程式碼: @Entity @Data public class Person { @Id @GeneratedValue private Integer id; @NotNul
select * 和 select 欄位的速度對比
拿WordPress的資料庫做一個對比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: 0.023000s SELECT * FROM wp_posts ORDER BY ID LIMIT 1
查詢所有表的欄位
SELECT USER_TAB_COLS.TABLE_NAME as 表名, UTC.COMMENTS as 表中文名, USER_TAB_COLS.COLUMN_ID as 列序號, USER_TAB_COLS.COLUM
mysql 設定@@sql_mode 解決查詢非分組裡欄位報錯問題
1 查詢sql_mode SELECT @@sql_mode; 2 把查詢的值複製黏貼,去掉ONLY_FULL_GROUP_BY,重新設定值 SET @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISI