守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1090|回复: 0

[Mongodb] MongoDB Plugin 1.0.7

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52620
    钢镚
    1422

    开源英雄守望者

    发表于 2016-8-30 13:39:28 | 显示全部楼层 |阅读模式
    本帖最后由 破晓 于 2016-8-30 13:49 编辑

    来源:http://www.cybermkd.com/mongodb-plugin-2/

    简介
    因为自己工作中会需要用到MongoDB,为了在JAVA上用MongoDB用得更舒服,所以开发了这个工具。
    相较于之前的版本,几乎重写所有代码。
    要求java8及以上,MongoDB由于3.0后改变较大,最好是3.2或以上。
    具有以下特性:

    • 与MongoDB版本同步,完美支持最新的3.2.6版本.
    • 使用方式更像是自然语言,用起来更舒适。
    • 简化mongodb     java driver 的操作,降低学习成本。
    • 支持MongoDB的授权机制(可以使用用户名和密码登录)、支持连接MongoDB副本集、读写分离、安全写入、SSL连接等特性。
    • 内置JFinal和Resty插件。(基于最新版的JFinal和Resty)
    如有疑问可加群:557692142或发送邮件到t-baby@zomake.com


    1.0.7
    增加索引相关支持
    增加Exist校验器,Query增加exist方法、or和nor方法
    增加日期校验支持
    增加聚合运算支持
    增加join查找等新特性
    修复bug和优化代码
    重写了所有测试类
    加载
    普通
    下载releases版本
    maven(github版本现发布,maven版本一般会比github版本慢一两天)
    1. <dependency>
    2.     <groupId>com.cybermkd</groupId>
    3.     <artifactId>MongodbPlugin</artifactId>
    4.     <version>1.0.7</version>
    5. </dependency>
    复制代码

    依赖
    本项目依赖于mongo-java-driver和fastjson、SLF4J(MongoDB官方建议使用)。如果使用JFinal或者其它插件的话,请自行加载相应项目的包。具体的依赖见https://github.com/T-baby/MongoDB-Plugin/blob/master/pom.xml
    1. <dependency>
    2.   <groupId>org.mongodb</groupId>
    3.   <artifactId>mongo-java-driver</artifactId>
    4.   <version>3.3.0</version>
    5. </dependency>

    6. <dependency>
    7.   <groupId>com.alibaba</groupId>
    8.   <artifactId>fastjson</artifactId>
    9.   <version>1.2.7</version>
    10. </dependency>

    11. <dependency>
    12.   <groupId>org.slf4j</groupId>
    13.   <artifactId>slf4j-api</artifactId>
    14.   <version>1.7.21</version>
    15. </dependency>
    复制代码



    初始化
    结合JFinal
    在configPlugin中加载
    1. MongoJFinalPlugin jFinalPlugin = new MongoJFinalPlugin();
    2. jFinalPlugin.add("127.0.0.1",27017);
    3. jFinalPlugin.setDatabase("test");
    4. me.add(jFinalPlugin);
    复制代码


    结合Resty
    在configPlugin中加载
    1. MongoRestyPlugin mongoRestyPlugin = new MongoRestyPlugin();
    2. mongoRestyPlugin.add("127.0.0.1",27017);
    3. mongoRestyPlugin.setDatabase("test");
    4. pluginLoader.add(mongoRestyPlugin);
    复制代码


    结合ICEREST
    在configPlugin中加载
    1. MongoIceRestPlugin mongoIcePlugin = new MongoIceRestPlugin();
    2. mongoIcePlugin.add("127.0.0.1",27017);
    3. mongoIcePlugin.setDatabase("test");
    4. pluginLoader.add(mongoIcePlugin);
    复制代码


    单独使用
    1. MongoPlugin mongoPlugin=new MongoPlugin();
    2. mongoPlugin.add("127.0.0.1",27017);
    3. mongoPlugin.setDatabase("test");
    4. MongoClient client = mongoPlugin.getMongoClient();
    5. MongoKit.init(client, mongoPlugin.getDatabase());
    6. client.close();
    复制代码


    高级特性
    由于JFinal插件和Resty插件都是继承MongoPlugin,所以下面这些方法使用起来都是一样的。
    1. plugin.add(主机地址,端口号);
    2. plugin.add(主机地址,端口号).add(主机地址,端口号).add(主机地址,端口号);
    复制代码


    登录数据库
    1. plugin.auth(用户名,密码);
    复制代码


    更多认证
    1. plugin.auth(原生驱动的MongoCredential);
    复制代码


    SSL连接
    1. plugin.ssl();
    复制代码

    连接超时
    1. plugin.connectTimeout(时间);
    复制代码


    更多设置
    1. plugin.opition(原生驱动的MongoClientOptions);
    复制代码


    读写分离
    1. plugin.readPreference();
    2. //首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点
    复制代码

    更多策略的读写分离
    1. plugin.readPreference(原生驱动的ReadPreference);
    复制代码


    安全写入
    1. plugin.writeConcern();
    2. //前几次修改操作仍然被记录在journal中,可以被还原也可以被撤销,避免数据不一致或弄脏的情况,写成功后再执行到真的数据集中。MongoDB2.6后默认开启了此功能。
    复制代码

    更多安全写入策略
    1. plugin.writeConcern(原生驱动的WriteConcern);
    复制代码


    最严格的安全写入
    1. plugin.writeSafe();
    2. //有些文章或教程推荐这么做,不过官方并不推荐,会影响性能。
    复制代码

    最佳实践(获取更多使用建议
    1. plugin.add(主机地址,端口号).add(主机地址,端口号).add(主机地址,端口号).setDatabase("test").auth(用户名,密码).ssl().readPreference().writeConcern();
    2. //非公网连接可以不用SSL
    复制代码


    操作
    所有操作都基于MongoQuery,如果是查找条件等等默认使用and连接,如果需要使用or,可以直接继承MongoKit和MongoQuery、对应的插件增加相应的方法。
    1. MongoQuery query=new
    2. MongoQuery();
    复制代码

    下文的query一律指MongoQuery对象。
    ps:所有操作都是批量的,所以建议在修改、删除时使用不重复的key或者尽可能详细指定。
    1. query.use("集合名")  //使用来指定集合。
    复制代码


    查找会基于fastjson返回一个格式化好的json list,更新、删除、插入都会返回影响的行数。
    插入
    1. query.use("集合名").set("key", "value").save()
    复制代码


    多个key和value只要直接在后面增加set即可。
    1. query.use("集合名").set(Object).save()  
    复制代码


    支持插入对象,自动转换Bean对象。
    1. query.use("集合名").set("key", "value").set("key2", "value2").save()   
    复制代码


    获取插入成功的数据的id
    1. 用刚刚用于插入的query对象,query.getID()
    复制代码


    批量插入
    使用add来增加,然后使用saveList来保存。
    1. 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查找:
    1. query.use("item").byId("5710a81ab73a87092e17a02b").find()   
    复制代码

    查找
    查找所有
    1. query.use("item").findAll()   
    复制代码

    根据条件查找
    1. query.use("item").eq("b","2").find()   
    复制代码

    (ps:MongoDB区分文本和数字,设定条件时要注意)
    反序列化查找结果
    1. query.use("item").eq("b","2").find(xx.class)
    复制代码

    获取结果数量
    1. 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)) ,这里的filtermongodb驱动自带的,想要知道更多条件可以到http://mongodb.github.io/mongo-java-driver/3.2/builders/filters/
    所有的条件都是默认以and连接,所以可以接多个条件,更新、查找、删除都是使用这种方式,比如我要查找一个年龄小于18岁名字中含有“陈”这个字的男生。
    1. query.lt("age",18).eq("sex","man").like("name","陈").find()   
    复制代码


    如果想要用or连接或者nor的话可以这么做:
    1. query.or(new MongoQuery().eq("age",18)).find();

    2. //将条件写在or里面
    复制代码

    在1.0.7版本中增加join特性,如果在插入时用join(本集合的字段名, 要关联的集合名, 要关联的ObjectId)插入的话,就可以在查找时利用join查找出来,直接join("本集合的字段名"),注意join只支持关联单个ObjectId,如需更实现类似 mysql的join的话可以参考聚合运算
    排序和数量
    find是支持排序和数量的,下面有两个例子。
    1. query.lt("age",18).后接以下方法:   

    2. .ascending(升序条件1,升序条件2....)
    3. .descending(降序条件1,降序条件2...)
    4. .limit(限定结果数量)     
    5. .projection(只返回列1,只返回列2...)
    6. .skip(跳过多少行)
    复制代码


    排序条件要求使用原生驱动的写法,详情见http://mongodb.github.io/mongo-java-driver/3.2/builders/sorts/
    当然如果你只要一个结果可以用findOne,而不是find。比如根据id查找;如果是想知道某个结果是否存在可以将find()替换成exist()。
    1. query.byId("id").findOne();
    复制代码


    其它常见查找:
    max(字段名)查找最大的一个、min(字段名)查找最小的一个,exist(字段名)只查找这个字段名存在的。
    分页
    使用分页很简单,只需要新建一个MongoPaginate对象即可,放入写好查询条件的query对象、每页行数和当前页数即可。
    1. MongoPaginate page=new MongoPaginate(new MongoQuery().use("student").descending("age").join("teacher"),每页行数,当前页数);

    2. page.findAll(Student.class); //无视条件查找所有

    3. page.find();//根据条件查找
    复制代码


    注意不要在被放入的query对象中使用limit和skip条件,以免影响到查询结果。
    更新
    更新操作的话直接在条件后追加modify即可,更新多个就追加多个。
    1. query.use("item").byId("5710a81ab73a87092e17a02b").modify("b","3").update()   

    2. query.use("item").eq("a","1").modify("b","3").update()   

    3. query.use("item").eq("a","1").modify("a","2").modify("b","3").update()   
    复制代码


    1.0.5版本支持以对象的方式更新,如果value为空或者没有内容则不会更新这个值,适合将bean对象直接放入。
    1. query.use("item").eq("a","1").modify(object).update()   
    复制代码

    更新操作默认是批量的,所以会更新满足条件的所有行,建议至少使用一个唯一字段或者是详细的条件。如果需要用到驱动原生的Updates Model,可以直接add(Updates Model);
    为了方便大家的使用,内置了自增:inc(key,value)。
    1. query.use("item").eq("a",1).inc("a",1).update()   
    复制代码

    如果只想要更新一条,那么可以用updateOne()。
    删除
    删除更查找基本一致,指定条件后直接加delete()即可。
    1. query.use("item").byId("5710a81ab73a87092e17a02b").delete()   

    2. query.use("item").eq("test","2").delete()  
    复制代码


    如果只想要删除一条,那么可以用deleteOne()
    校验
    1.0.5支持对bean对象的值进行校验。详情见http://www.cybermkd.com/mongodb-pluginxiao-yan-qi-shi-yong-zhi-nan/
    聚合运算
    1.0.7支持聚合运算特性。详情见http://www.cybermkd.com/mongodb-pluginju-he-yun-suan/
    索引操作
    1.0.7支持操作mongodb的索引。详情见http://www.cybermkd.com/mongodb-pluginxiao-yan-qi/


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2024-3-29 13:04 , Processed in 0.050733 second(s), 31 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表