天天看點

MongoDB Plugin 部分文檔

#公司新項目 有訂單需求需要 為每位使用者彙總訂單,是以使用了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()

繼續閱讀