#公司新項目 有訂單需求需要 為每位使用者彙總訂單,是以使用了mongo 來彙總 ,在hub上開源項目中中文文檔連結 挂掉了 ,搜了好久搜到了這邊博,算是湊合用 轉來自己收藏希望幫到後來的人.已發郵件給開源項目管理人,告知文檔挂掉了
簡介
因為自己工作中會需要用到MongoDB,為了在JAVA上用MongoDB用得更舒服,是以開發了這個工具。
相較于之前的版本,幾乎重寫所有代碼。
要求java7及以上,MongoDB由于3.0後改變較大,最好是3.2或以上。
具有以下特性:
- 與MongoDB版本同步,完美支援最新的3.2.6版本.
- 使用方式更像是自然語言,用起來更舒适。
- 簡化mongodb java driver 的操作,降低學習成本。
- 支援MongoDB的授權機制(可以使用使用者名和密碼登入)、支援連接配接MongoDB副本集、讀寫分離、安全寫入、SSL連接配接等特性。
- 内置JFinal和Resty插件。(基于最新版的JFinal和Resty)
如有疑問可加群:557692142或發送郵件到[email protected]
項目位址:https://github.com/T-baby/MongoDB-Plugin
1.0.4
–RestyPlugin–
修複一個啟動時的bug
–MongoKit–
增加了find(Class),用于反序列化
–MongoQuery–
增加set(Object)方法,用于序列化對象
加載
普通
可以直接到https://github.com/T-baby/MongoDB-Plugin/releases/tag/1.0.3
下載下傳releases版本
maven(github版本現釋出,maven版本一般會比github版本慢一兩天)
<dependency>
<groupId>com.cybermkd</groupId>
<artifactId>MongodbPlugin</artifactId>
<version>1.0.3</version>
</dependency>
依賴
本項目依賴于mongo-java-driver和fastjson、SLF4J(MongoDB官方建議使用)。如果使用JFinal或者其它插件的話,請自行加載相應項目的包。具體的依賴見https://github.com/T-baby/MongoDB-Plugin/blob/master/pom.xml
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
初始化
結合JFinal
在configPlugin中加載
MongoJFinalPlugin jFinalPlugin = new MongoJFinalPlugin();
jFinalPlugin.add("127.0.0.1",27017);
jFinalPlugin.setDatabase("test");
me.add(jFinalPlugin);
結合Resty
在configPlugin中加載
MongoRestyPlugin mongoRestyPlugin = new MongoRestyPlugin();
mongoRestyPlugin.add("127.0.0.1",27017);
mongoRestyPlugin.setDatabase("test");
pluginLoader.add(mongoRestyPlugin);
單獨使用
MongoPlugin mongoPlugin=new MongoPlugin();
mongoPlugin.add("127.0.0.1",27017);
mongoPlugin.setDatabase("test");
MongoClient client = mongoPlugin.getMongoClient();
MongoKit.init(client, mongoPlugin.getDatabase());
client.close();
進階特性
由于JFinal插件和Resty插件都是繼承MongoPlugin,是以下面這些方法使用起來都是一樣的。
連接配接副本集(不會搭建副本?狂戳我獲得北大綠卡一本(づ ̄ 3 ̄)づ)
plugin.add(主機位址,端口号);
plugin.add(主機位址,端口号).add(主機位址,端口号).add(主機位址,端口号);
登入資料庫
plugin.auth(使用者名,密碼);
更多認證
plugin.auth(原生驅動的MongoCredential);
SSL連接配接
plugin.ssl();
連接配接逾時
plugin.connectTimeout(時間);
更多設定
plugin.opition(原生驅動的MongoClientOptions);
讀寫分離
plugin.readPreference();
//首選從節點,大多情況下讀操作在從節點,特殊情況(如單主節點架構)讀操作在主節點
更多政策的讀寫分離
plugin.readPreference(原生驅動的ReadPreference);
安全寫入
plugin.writeConcern();
//前幾次修改操作仍然被記錄在journal中,可以被還原也可以被撤銷,避免資料不一緻或弄髒的情況,寫成功後再執行到真的資料集中。MongoDB2.6後預設開啟了此功能。
更多安全寫入政策
plugin.writeConcern(原生驅動的WriteConcern);
最嚴格的安全寫入
plugin.writeSafe();
//有些文章或教程推薦這麼做,不過官方并不推薦,會影響性能。
最佳實踐(擷取更多使用建議)
plugin.add(主機位址,端口号).add(主機位址,端口号).add(主機位址,端口号).setDatabase("test").auth(使用者名,密碼).ssl().readPreference().writeConcern();
//非公網連接配接可以不用SSL
操作
所有操作都基于MongoQuery,如果是查找條件等等預設使用and連接配接,如果需要使用or,可以直接繼承MongoKit和MongoQuery、對應的插件增加相應的方法。
MongoQuery query=new MongoQuery();
下文的query一律指MongoQuery對象。
ps:所有操作都是批量的,是以建議在修改、删除時使用不重複的key或者盡可能詳細指定。
query.use("集合名") //使用來指定集合。
查找會基于fastjson傳回一個格式化好的json list,更新、删除、插入都會傳回影響的行數。
插入
query.use("集合名").set("key", "value").save()
多個key和value隻要直接在後面增加set即可。
query.use("集合名").set(Object).save()
支援插入對象,自動轉換Bean對象。
query.use("集合名").set("key", "value").set("key2", "value2").save()
擷取插入成功的資料的id
用剛剛用于插入的query對象,query.getID()
批量插入
使用add來增加,然後使用saveList來儲存。
query.use("item").add(new MongoQuery().set("a", "1").set("b", "2")).add(new MongoQuery().set("a", "1").set("b", "3")).saveList();
根據ID操作
MongoQuery支援通過ID來查找、更新、插入。
為了大家友善,已經自帶了一個byId方法。查找、更新、删除都可以接這個方法。如下面根據ID查找:
query.use("item").byId("5710a81ab73a87092e17a02b").find()
查找
查找所有
query.use("item").findAll()
根據條件查找
query.use("item").eq("b","2").find()
(ps:MongoDB區分文本和數字,設定條件時要注意)
反序列化查找結果
query.use("item").eq("b","2").find(xx.class)
擷取結果數量
query.use("item").eq("b","2").count()
條件
在use後面接着的就是條件,支援以下條件:
- in() 包含,如果key為_id會自動将文本id轉為mongodb所需的ObjectId
- eq() 等于
- ne() 不等于
- gt() 大于
- lt() 小于
- gte() 大于等于
- lte() 小于等于
- like() 模糊查找,like除了支援含有,還支援以什麼開頭或以什麼結尾的查找。
- like(int type,String key, String value) 1為以什麼開頭,除了1以外的數字都是以什麼結尾。
-
如果還需要更多的條件,可以通過 query.filter() 來加載原生條件,如:
query.filter(Filters.in(key, value)) ,這裡的filter是mongodb驅動自帶的,想要知道更多條件可以到http://mongodb.github.io/mongo-java-driver/3.2/builders/filters/
所有的條件都是預設以and連接配接,是以可以接多個條件,更新、查找、删除都是使用這種方式,比如我要查找一個年齡小于18歲名字中含有“陳”這個字的男生。
query.lt("age",18).eq("sex","man").like("name","陳").find()
排序和數量
find是支援排序和數量的,下面有兩個例子。
query.lt("age",18).後接以下方法:
.ascending(升序條件1,升序條件2....)
.descending(降序條件1,降序條件2...)
.limit(限定結果數量)
.projection(隻傳回列1,隻傳回列2...)
.skip(跳過多少行)
排序條件要求使用原生驅動的寫法,詳情見http://mongodb.github.io/mongo-java-driver/3.2/builders/sorts/
分頁
使用分頁很簡單,隻需要建立一個MongoPaginate對象即可,放入寫好查詢條件的query對象、每頁行數和目前頁數即可。
注意不要在被放入的query對象中使用limit和skip條件,以免影響到查詢結果。
更新
更新操作的話直接在條件後追加modify即可,更新多個就追加多個。
query.use("item").byId("5710a81ab73a87092e17a02b").modify("b","3").update()
query.use("item").eq("a","1").modify("b","3").update()
query.use("item").eq("a","1").modify("a","2").modify("b","3").update()
更新操作預設是批量的,是以會更新滿足條件的所有行,建議至少使用一個唯一字段或者是詳細的條件。如果需要用到驅動原生的Updates Model,可以直接add(Updates Model);
為了友善大家的使用,内置了自增:inc(key,value)。
query.use("item").eq("a",1).inc("a",1).update()
删除
删除更查找基本一緻,指定條件後直接加delete()即可。
原文位址:http://it.lindukj.cn/archives/2027
query.use("item").byId("5710a81ab73a87092e17a02b").delete()
query.use("item").eq("test","2").delete()