Spring Data MongoDB 三:基本文檔查詢(Query、BasicQuery)(一)
學(xué)習(xí)MongoDB 六: MongoDB查詢(游標操作、游標信息)(三)
SpringData MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的find的操作,我們上一篇介紹了基本文檔的查詢,我們今天介紹分頁查詢,分頁查詢是返回到匹配文檔的游標,可以隨意修改查詢限制、跳躍、和排序順序的功能。
我們在查詢時find()方法接受Query類型有org.springframework.data.mongodb.core.query和org.springframework.data.mongodb.core.query.BasicQuery
Query類提供方法有l(wèi)imit、skip、sort查詢限制、跳躍、和排序順序的功能,BasicQuery繼承了Query類。
Query | Mongodb | 說明 |
Query limit (int limit) | limit | 方法是限制游標返回結(jié)果的數(shù)量 |
Query skip (int skip) | skip | 方法可以跳過指定值的條數(shù),返回剩下的條數(shù)的結(jié)果,可以跟limit()方法進行組合可以實現(xiàn)分頁的效果 |
Sort sort () 已過時 現(xiàn)在是用query.with(sort) | sort | 方法來對數(shù)據(jù)進行排序,根據(jù)指定的字段,并使用1或-1來指定排序方式是升序或降序,類似于SQL的order by。 |
Query類提供方法有l(wèi)imit、skip、sort查詢限制、跳躍、和排序順序的功能,我們實現(xiàn)Query查詢分頁
第一步:實現(xiàn)分頁工具類
第二步:實現(xiàn)分頁
說明:
Sort :sort () 已過時,現(xiàn)在是用query.with(sort),with參數(shù)是sort類
Sort提供了幾種構(gòu)造函數(shù)
方法的描述
(1)一個字段的排序
例如onumber字段升序
query.with(new Sort(Direction.ASC,"onumber"));
(2)如果是多個字段時同時升序或者降序時
//排序
query.with(new Sort(Direction.ASC,"a","b","c"));
(3)不同的字段按照不同的排序
a升序在按b降序
第三步:測試類
查詢條件是cname=zcy
skip方法是跳過條數(shù),而且是一條一條的跳過,如果集合比較大時(如書頁數(shù)很多)skip會越來越慢, 需要更多的處理器(CPU),這會影響性能。
返回到匹配文檔的游標,可以隨意修改查詢限制、跳躍、和排序順序的功能,我們這邊對指針返回的結(jié)果,我用到Morphia框架。
Morphia是一個開放源代碼的對象關(guān)系映射框架,它對MongoDB數(shù)據(jù)庫 Java版驅(qū)動進行了非常輕量級的對象封裝。我們需要通過DBCurosr獲取的DBObject轉(zhuǎn)換成我們對應(yīng)的實體對象,方便我們操作實體。
DBCurosr 是 DBCollection 的 find 方法返回的對象,可以設(shè)置 skip、limit 、sot等屬性執(zhí)行分頁查詢
第一步:在實體id要注解@id
importcom.google.code.morphia.annotations.Id;
@Id
privateString id;
@Id 注釋指示Morphia哪個字段用作文檔 ID
如果沒加的話,會出現(xiàn)這樣的錯誤
...27 more
Caused by: com.google.code.morphia.mapping.validation.ConstraintViolationException: Number of violations: 1
NoId complained aboutcom.mongo.model.Orders. : No field is annotated with @Id; but it is required
atcom.google.code.morphia.mapping.validation.MappingValidator.validate(MappingValidator.java:66)
atcom.google.code.morphia.mapping.validation.MappingValidator.validate(MappingValidator.java:155)
atcom.google.code.morphia.mapping.MappedClass.validate(MappedClass.java:259)
atcom.google.code.morphia.mapping.Mapper.addMappedClass(Mapper.java:154)
atcom.google.code.morphia.mapping.Mapper.addMappedClass(Mapper.java:142)
atcom.google.code.morphia.Morphia.map(Morphia.java:55)
atcom.mongo.dao.impl.OrdersDaoImpl.<init>(OrdersDaoImpl.java:37)
atsun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
atsun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
atjava.lang.reflect.Constructor.newInstance(Unknown Source)
atorg.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
... 29more
第二步:實現(xiàn):
我們開始執(zhí)行DAO時,先初始化Morphia,并往里面添加我們需要轉(zhuǎn)換的實體類CLASS
morphia=new Morphia();
morphia.map(Orders.class);
dbCursor.hasNext()判斷是否還有下一個文檔(DBObject), dbCursor.Next()獲取DBObject時,我們通過Morphia把DBObject對應(yīng)的實體類。
查詢時通過filterDBObject 設(shè)置返回需要的字段
MongoDB服務(wù)器返回的查詢結(jié)果,當調(diào)用cursor.hasNext()時,MongoDB批量的大小不會超過最大BSON文檔大小,然而對于大多數(shù)查詢,第一批返回101文檔或足夠的文件超過1 MB,后續(xù)的批大小為4 MB。如果第一批是返回101個文檔時,遍歷完時,執(zhí)行hasNext,會到數(shù)據(jù)庫查詢結(jié)果,直到所有結(jié)果都被返回,游標才會結(jié)關(guān)閉。
mongoTemplate .findAll 查詢集合所有的文檔 相當于MongoDB的db.collect.find()。
mongoTemplate .findById 根據(jù)文檔_ID查詢對應(yīng)的文檔。
mongoTemplate .findAndRemove 根據(jù)查詢條件,查詢匹配的文檔返回,并從數(shù)據(jù)庫中刪除。
我們在查詢時,這邊默認是有使用到索引,對于數(shù)據(jù)量大的文檔,需要建立合適的索引,加快查詢效率。