1、Jongo可以用来做什么?
 
Jongo框架的目的是使在MongoDB中可以直接使用的查询Shell可以直接在Java中使用。在官网首页有一个非常简洁的例子:
 
SHELL:这种查询方式是MongoDB数据库支持的查询方式。
JAVA DRIVER:是MongoDB Java驱动API中提供的查询方式
JONGO:就是jongo框架提供的查询方式。
 
由此可以看出,JONGO框架的意图很明显。
 
2、Jongo的下载
 
    关于MongoDB的安装在此不作赘述,大家可以去它的官网上查看,介绍的非常详细了,http://docs.mongodb.org/manual/installation/
 
    在Jongo的官网上,介绍说jongo框架的使用依赖于 Jackson 2.2.3, Bson4Jackson 2.2.3 and Mongo Java Driver 2.11+,而jongo目前最新的版本为1.0。通过我的尝试,我发现在实际应用中需要用到以下jar包:
bson4jackson-2.3.1.jar
jackson-annotations-2.4.1.jar
jackson-core-2.4.1.1.jar
jackson-databind-2.4.1.2.jar
jongo-1.0.jar
mongo-java-driver-2.12.2.jar
这些jar包都可以在Maven仓库中找到,http://mvnrepository.com/
 
Jongo官网:http://jongo.org/
 
3、Jongo的使用
 
PersonInfo类:
 package com.jongo.enties;

 public class PersonInfo {

  private int id;
private String person_name;
private String sex;
private String relationship; public PersonInfo() { }
//getter and setter
@Override
public String toString() {
return "PersonInfo [id=" + id + ", person_name=" + person_name
+ ", sex=" + sex + ", relationship=" + relationship + "]";
}
}
1)第一个简单的例子
package com.jongo.demo;

import java.util.Iterator;

import org.jongo.Jongo;
import org.jongo.MongoCollection; import com.jongo.enties.PersonInfo;
import com.mongodb.DB;
import com.mongodb.MongoClient; public class FirstDemo { public static void main(String[] args) { MongoClient mongo = null;
try {
mongo = new MongoClient("localhost",27017);
DB db = mongo.getDB("jongo");
Jongo jongo = new Jongo(db); MongoCollection person_info = jongo.getCollection("person_info"); @SuppressWarnings("unchecked")
Iterator<PersonInfo> all = (Iterator<PersonInfo>) person_info.find().as(PersonInfo.class);
while(all.hasNext()) {
PersonInfo personInfo = all.next();
System.out.println("all:"+personInfo);
} PersonInfo one = (PersonInfo) person_info.findOne("{id:1}").as(PersonInfo.class);
System.out.println("one:"+one); } catch(Exception e) {
e.printStackTrace();
} finally {
if(mongo != null) {
mongo.close();
}
}
}
}
运行结果:
all:PersonInfo [id=1, person_name=xiaoming, sex=Man, relationship=Friend]
all:PersonInfo [id=2, person_name=xiaohong, sex=Male, relationship=Friend]
one:PersonInfo [id=1, person_name=xiaoming, sex=Man, relationship=Friend]
 
2)Jongo的Save
  PersonInfo personInfo = new PersonInfo(4,"Marry","Male","ClassMate");
  mcoll.save(personInfo);
 
3)Jongo的Update
在Jongo中,Update语法和Mongo Shell有一点点不同,修改的查询语句需要通过使用with()来实现,with()内可以包含一个字符串,或者是一个对象。
 
(1)person_info.update(new ObjectId("53cb7d99b963ac657273328c")).with("{$inc: {id: 2}}");
 
原始记录:{ "_id" : ObjectId("53cb7d99b963ac657273328c"), "id" : 6, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate" }
更新后:{ "_id" : ObjectId("53cb7d99b963ac657273328c"), "id" : 8, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate" }
 
(2)person_info.update("{person_name : 'Dark'}").with("{$set:{person_name:'Dark Update'}}");
 
原始记录:{ "_id" : ObjectId("53cb7d91b963ac657273328a"), "id" : 5, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate" }
更新后:{ "_id" : ObjectId("53cb7d91b963ac657273328a"), "id" : 5, "person_name" : "Dark Update", "sex" : "Male", "relationship" : "ClassMate" }
 
这种Update方式只会改变第一个被找到的记录。而下面这种方式将会更新所有person_name为Dark的记录:
person_info.update("{person_name : 'Dark'}").multi().with("{$set:{person_name:'Dark Update'}}");
 
(3)person_info.update("{person_name : 'Dark'}").with(new PersonInfo(10, "Dark Update Object", "Man", "ClassMate"));
 
原始记录:{ "_id" : ObjectId("53cb82ebb963ac657273329d"), "id" : 5, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate" }
更新后:{ "_id" : ObjectId("53cb82ebb963ac657273329d"), "id" : 10, "person_name" : "Dark Update Object", "sex" : "Man", "relationship" : "ClassMate" }
 
(4)person_info.update("{person_name : 'Dark'}").with("{$set:{address:#}}",new Address("0755","shenzhen"));
 
原始记录:{ "_id" : ObjectId("53cb8310b963ac657273329e"), "id" : 5, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate" }
更新后:{ "_id" : ObjectId("53cb8310b963ac657273329e"), "id" : 5, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate", "address" : { "regionI d" : "0755", "provinceName" : "shenzhen" } }
 
4)Jongo的Insert
(1)person_info.insert("{person_name:'Insert Demo'}");
结果:{ "_id" : ObjectId("53cb85cf2fd87f4058d1ff93"), "person_name" : "Insert Demo" }
 
(2)插入一条记录
PersonInfo personInfo = new PersonInfo(6,"Marry Insert","Male","ClassMate");
person_info.insert(personInfo);
结果:{ "_id" : ObjectId("53cb85e0b963ac65727332a3"), "id" : 6, "person_name" : "Marry Insert", "sex" : "Male", "relationship" : "ClassMate" }
 
(3)插入多条记录:
PersonInfo personInfo2 = new PersonInfo(7,"Marry Insert2","Male","ClassMate");
person_info.insert(personInfo,personInfo2); //方式一
person_info.insert(new Object[]{personInfo,personInfo2});//方式二
 
5)Jongo的Remove
  person_info.remove(); //删除所有
  person_info.remove(new ObjectId("53cb87c02fd8f9ffd258ceb3"));
  person_info.remove("{person_name:'Marry Insert'}");
 
6)Jongo的Query
在Jongo中,Query和Mongo Shell中的Query几乎是一致的。
我们先来看看在Mongo Shell中如何查询:
原始记录:{ "_id" : ObjectId("53cb8e8a2602b31118434306"), "id" : 2, "person_name" : "xiaohong", "sex" : "Male", "relationship" : "Friend" }
//对于数字类型
> db.person_info.find({id:2});
或者> db.person_info.find({"id":2});
{ "_id" : ObjectId("53cb8e8a2602b31118434306"), "id" : 2, "person_name" : "xiaohong", "sex" : "Male", "relationship" : "Friend" }
//对于字符串类型
> db.person_info.find({person_name:'xiaohong'});  
或者> db.person_info.find({"person_name":"xiaohong"});
{ "_id" : ObjectId("53cb8e8a2602b31118434306"), "id" : 2, "person_name" : "xiaohong", "sex" : "Male", "relationship" : "Friend" }
 
那么,在Jongo中怎么查询呢?其实,在上面的第一个简单例子中我们已经见识过了,
Iterator<PersonInfo> all = (Iterator<PersonInfo>) person_info.find().as(PersonInfo.class);
PersonInfo one = (PersonInfo) person_info.findOne("{id:1}").as(PersonInfo.class);
 
我们再来看看这种文档结构:{ "_id" : ObjectId("53cb9015b963ac65727332a4"), "id" : 5, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate", "address" : { "regionI
d" : "0755", "provinceName" : "shenzhen" } },假如我要查询出address中regionId为0755的记录,该怎么做?
 
在Mongo Shell中,我们是这样查询的:db.person_info.find({"address.regionId":"0755"});或者db.person_info.find({'address.regionId':'0755'});
 
在Jongo中的做法也是如出一辙,
PersonInfo personInfo =  (PersonInfo) person_info.findOne("{address.regionId:'0755'}").as(PersonInfo.class);
 
7)Jongo如何查询出指定字段(不查询某字段)?
我们一般通过{field:1}或{field:0}来控制查询字段的显示与否。
 
在Mongo Shell中,做法如下:
> db.person_info.find({},{person_name:1,_id:0}); //查询出person_name,不查询出_id。
{ "person_name" : "xiaohong" }
{ "person_name" : "Dark" }
 
而在Jongo中我们需要使用projection来到达这种效果。
  PersonInfo personInfo =
    (PersonInfo) person_info.findOne().projection("{person_name:1,id:1}").as(PersonInfo.class);
 
8)Jongo的Sort、Skip、Limit、Hint、Count
在Jongo中Sort、Skip、Limit、Hint、Count基本和Mongo Shell一致。
假设数据集合中有这样两天记录:
> db.person_info.find()
{ "_id" : ObjectId("53cb8e8a2602b31118434306"), "id" : 2, "person_name" : "xiaohong", "sex" : "Male", "relationship" : "Friend" }
{ "_id" : ObjectId("53cb9015b963ac65727332a4"), "id" : 5, "person_name" : "Dark", "sex" : "Male", "relationship" : "ClassMate", "address" : { "regionI
d" : "0755", "provinceName" : "shenzhen" } } Iterator<PersonInfo> sort = (Iterator<PersonInfo>) person_info.find().sort("{id:1}").as(PersonInfo.class);//sort {field:1} 升序,{field:-1} 降序 Iterator<PersonInfo> skip = (Iterator<PersonInfo>) person_info.find().skip(1).as(PersonInfo.class);//查询时跳过多少条记录 Iterator<PersonInfo> limit = (Iterator<PersonInfo>) person_info.find().limit(2).as(PersonInfo.class);//查询指定数量的记录 Iterator<PersonInfo> hint = (Iterator<PersonInfo>) person_info.find().hint("{person_name:-1}").as(PersonInfo.class);//在查询过程中强制使用hint指定的索引方式,注意必须事先建立person_name字段的倒序索引。 long len = person_info.count("{id:5}");//查询满足条件的记录数
9)Jongo的Oid
在映射部分,_id的定义可有注解@ObjectId来控制,如果你想完全地避免使用原先驱动包的ObjectId,可以使用Jongo提供的Oid类。其用法如下:
import static org.jongo.Oid.withOid;
PersonInfo personInfo= new PersonInfo(); // @ObjectId String _id PersonInfo类中需要定义一个名为_id的字段,且加上@ObjectId注解
person_info.save(personInfo);
person_info.find(withOid(personInfo._id)).as(PersonInfo .class); // instead of new ObjectId(personInfo._id)
10)Jongo的查询模板
几乎所有查询Jongo可以模板化:添加锚#。绑定参数可以BSON原语或任何复杂类型。
PersonInfo personInfo = person_info.findOne("{id:#,person_name:#}",2,"xiaohong").as(PersonInfo.class); //相当于findOne("{id:2,person_name:'xiaohong'}")

PersonInfo personInfo2 = person_info.findOne("{address:#}",new Address("0755","shenzhen")).as(PersonInfo.class); //相当于 db.person_info.findOne({'address.regionId':'0755','address.privinceName':'shenzhen'});

Iterator<PersonInfo> ite =  (Iterator<PersonInfo>) person_info.find("{id:{$in:#}}",ids).as(PersonInfo.class); //相当于db.person_info.find({id:{$in:[2,5]}});
11)Jongo的正则查询
以下几种正则查询都是等价的:

  PersonInfo personInfo1 =
person_info.findOne("{person_name:{$regex:#}}","Dar.*").as(PersonInfo.class); PersonInfo personInfo2 =
person_info.findOne("{person_name:{$regex:'Dar.*'}}").as(PersonInfo.class); PersonInfo personInfo3 =
person_info.findOne("{person_name:#}",Pattern.compile("Dar.*")).as(PersonInfo.class); Pattern p = Pattern.compile("Dar.*");
PersonInfo personInfo4 =
person_info.findOne("{person_name:{$regex:'"+p+"'}}").as(PersonInfo.class);
12)Jongo的聚合操作
 
(1)Distinct
List<String> personNames = person_info.distinct("person_name").as(String.class);
List<Address> addresses = person_info.distinct("address").query("{id:5}").as(Address.class);
int size = person_info.distinct("address").query("{id:5}").as(Address.class).size();
 
(2)聚合框架
这个特性只能在Mongo2.2以上版本中使用,所有诸如$project, $match, $limit, $skip, $unwind, $group, $sort的聚合操作都支持。在官网有一个例子:
collection.aggregate("{$project:{sender:1}}")
.and("{$match:{tags:'read'}}")
.and("{$limit:10}")
.as(Email.class);
4、对象映射
      查询结果自动映射到对象,它依赖于Jackson,涉及文档结构,处理列表以及忽略缺失的属性。仅仅需要一个无参构造器(甚至私有构造器都行,前提是对象是不可变的,注解@JsonCreator可以用来替代)
      _id在每个MongoDB文档中是一个唯一的标识符,如果没有被设定,它将自动生成,用Jongo来定义它时,一个属性需要被命名为_id或者带有@Id注解(别名 @JsonProperty("_id")),可以使用专门的ObjectId类或者一个简单的由@ObjectId注解的简单字符串来定义。
        需要注意的是,当你保存一个自定义的文档_id时(任何Java类型,除了数组意外,只要它是唯一值)总是需要在持久化之前手动的去进行设置。
        以下几种情形式需要手动设置_id的:
   
        而下面这几种是自动生成的:
   

MongoDB框架Jongo的使用介绍的更多相关文章

  1. 基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍

    在前面介绍了一系列的<基于Metronic的Bootstrap开发框架经验总结>的随笔文章,随笔主要是介绍各个知识点的内容,对框架的总体性界面没有很好的阐述,本篇随笔主要介绍这个Boots ...

  2. xmpp整理笔记:xmppFramework框架的导入和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...

  3. vue框架入门和ES6介绍

    vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...

  4. SSM 框架集-01-详细介绍-入门问题篇

    SSM 框架集-01-详细介绍-入门问题篇 刚开始了解 SSM,首先先解决几个基础问题 1.什么是 SSM 框架集? SSM(Spring+SpringMVC+MyBatis)框架集由 Spring. ...

  5. Python爬虫教程-32-Scrapy 爬虫框架项目 Settings.py 介绍

    本篇介绍项目开发的过程中,对 Setting 文件的配置和使用 Python爬虫教程-32-Scrapy 爬虫框架项目 Settings.py 介绍 settings.py 文件的使用 想要详细查看 ...

  6. 带你手写基于 Spring 的可插拔式 RPC 框架(一)介绍

    概述 首先这篇文章是要带大家来实现一个框架,听到框架大家可能会觉得非常高大上,其实这和我们平时写业务员代码没什么区别,但是框架是要给别人使用的,所以我们要换位思考,怎么才能让别人用着舒服,怎么样才能让 ...

  7. Django框架使用一 基本介绍,安装和建项篇

    Django概述 Django 是在快节奏的编辑环境中开发的,设计使得常见 Web 开发任务快速且容易;它可以编写一个数据驱动的Web应用程序,简单的说就是不需要开发者操作数据库. 设计数据模型 尽管 ...

  8. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

  9. MongoDB Auto-Sharding(自动分片)入门介绍

    MongoDB是10gen团队开发的一款面向文档的NoSQL数据库.最近一年多以来,MongoDB被越来越多的大型网站应用到生产环境中,比较著名的有Foursquare, bit.ly, Source ...

随机推荐

  1. Win 10 安装手机驱动

    直接上图,看图操作即可.

  2. netty2 案例:数据通信

    在实际的项目中应该如何使用netty去通信呢? 一般来说,会有以下三种情况, 1长连接 也就是服务器和客户端的通道一直不关闭,如果服务器性能非常好,并且在客户端数量不是很多的情况下,可以选择使用这种方 ...

  3. C# Winform 登录中的忘记密码及自动登录

    本地保存登录账号实现忘记密码及自动登录 #region 删除本地自动登录及记住密码信息 /// <summary> /// 删除本地自动登录及记住密码信息 /// </summary ...

  4. IIS7部署网站遇到的问题

    1.web.config文件中更改配置项时:  因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改.  运行命令行 %windir%\system32\ ...

  5. C#语言不常用语法笔记

    只看过3天C#语法书,了解个大概,与C++等不同之处,或者看开源遇到一些奇异用法,记录一下,脑子不够用的情况下,还是记笔记靠谱. ==================== 顺便吐槽下,这年头得会各种编 ...

  6. leetcode(java)

    86 class Solution { public ListNode partition(ListNode head, int x) { ListNode lowheader=new ListNod ...

  7. 前端之html概述及基本结构

    html概述: HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网页的语言,这种语言由一个个的标 ...

  8. sqrt()函数对素数判断的优化

    素数是只有1和本身能整除的整数.所以在求素数的时候,要将素数与1到素数本身中间的所有整数都相除,看是否有整除的数,如果有,那肯定不是素数了.但是从算法上考虑,为了减少重复量,开平方后面的数就不用相除了 ...

  9. 调用opencv相关函数,从视频流中提取出图片序列&&&&jpg图片序列,转化成avi格式视频

    /************************ @HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码 ...

  10. 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点

    前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...