`
oywl2008
  • 浏览: 1050944 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Jongo可以用来做什么 非常好

 
阅读更多
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/
 <dependency>
            <groupId>org.jongo</groupId>
            <artifactId>jongo</artifactId>
            <version>1.3.0</version>
        </dependency>
        
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一致。
假设数据集合中有这样两天记录:
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. > db.person_info.find()  
  2. "_id" : ObjectId("53cb8e8a2602b31118434306"), "id" : 2"person_name" : "xiaohong""sex" : "Male""relationship" : "Friend" }  
  3. "_id" : ObjectId("53cb9015b963ac65727332a4"), "id" : 5"person_name" : "Dark""sex" : "Male""relationship" : "ClassMate""address" : { "regionI  
  4. d" : "0755", "provinceName" : "shenzhen" } }  
  5.   
  6. Iterator<PersonInfo> sort = (Iterator<PersonInfo>) person_info.find().sort("{id:1}").as(PersonInfo.class);//sort {field:1} 升序,{field:-1} 降序  
  7.   
  8. Iterator<PersonInfo> skip = (Iterator<PersonInfo>) person_info.find().skip(1).as(PersonInfo.class);//查询时跳过多少条记录  
  9.   
  10. Iterator<PersonInfo> limit = (Iterator<PersonInfo>) person_info.find().limit(2).as(PersonInfo.class);//查询指定数量的记录  
  11.   
  12. Iterator<PersonInfo> hint = (Iterator<PersonInfo>) person_info.find().hint("{person_name:-1}").as(PersonInfo.class);//在查询过程中强制使用hint指定的索引方式,注意必须事先建立person_name字段的倒序索引。  
  13.   
  14. long len = person_info.count("{id:5}");//查询满足条件的记录数  
9)Jongo的Oid
在映射部分,_id的定义可有注解@ObjectId来控制,如果你想完全地避免使用原先驱动包的ObjectId,可以使用Jongo提供的Oid类。其用法如下:
 
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. import static org.jongo.Oid.withOid;  
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. PersonInfo personInfo= new PersonInfo(); // @ObjectId String _id  PersonInfo类中需要定义一个名为_id的字段,且加上@ObjectId注解  
  2. person_info.save(personInfo);  
  3. person_info.find(withOid(personInfo._id)).as(PersonInfo .class); // instead of new ObjectId(personInfo._id)  
10)Jongo的查询模板
几乎所有查询Jongo可以模板化:添加锚#。绑定参数可以BSON原语或任何复杂类型。
 
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. PersonInfo personInfo = person_info.findOne("{id:#,person_name:#}",2,"xiaohong").as(PersonInfo.class); //相当于findOne("{id:2,person_name:'xiaohong'}")  
  2.   
  3. PersonInfo personInfo2 = person_info.findOne("{address:#}",new Address("0755","shenzhen")).as(PersonInfo.class); //相当于 db.person_info.findOne({'address.regionId':'0755','address.privinceName':'shenzhen'});  
  4.   
  5. Iterator<PersonInfo> ite =  (Iterator<PersonInfo>) person_info.find("{id:{$in:#}}",ids).as(PersonInfo.class); //相当于db.person_info.find({id:{$in:[2,5]}});  
 
11)Jongo的正则查询
以下几种正则查询都是等价的:
 
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. PersonInfo personInfo1 =  
  2.    person_info.findOne("{person_name:{$regex:#}}","Dar.*").as(PersonInfo.class);  
  3.   
  4.  PersonInfo personInfo2 =  
  5.    person_info.findOne("{person_name:{$regex:'Dar.*'}}").as(PersonInfo.class);  
  6.   
  7.  PersonInfo personInfo3 =  
  8.    person_info.findOne("{person_name:#}",Pattern.compile("Dar.*")).as(PersonInfo.class);  
  9.   
  10.  Pattern p = Pattern.compile("Dar.*");  
  11.  PersonInfo personInfo4 =  
  12.    person_info.findOne("{person_name:{$regex:'"+p+"'}}").as(PersonInfo.class);  
 
12)Jongo的聚合操作
 
(1)Distinct
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. List<String> personNames = person_info.distinct("person_name").as(String.class);  
  2. List<Address> addresses = person_info.distinct("address").query("{id:5}").as(Address.class);  
  3. 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的:
 
 
http://blog.csdn.net/whxaing2011/article/details/37997239
 
 
 
 
分享到:
评论

相关推荐

    Jongo-用Java实现像Mongoshell一样的查询

    在实际开发中,可以利用Jongo的灵活性和易用性来提高开发效率,同时,结合MongoDB丰富的功能,如聚合框架、地理空间索引等,可以构建出高效、灵活的数据处理系统。在处理大量文档或执行复杂查询时,Jongo能够提供...

    t5contrib-jongo:Tapestry5 - Jongo 模块

    Jongo则是一个Java库,它为MongoDB提供了一种更直观、面向对象的方式来操作数据,使得开发者可以避免直接编写原生的MongoDB查询语言(即MongoDB的JavaScript语法)。 Tapestry5是一款强大的Java Web开发框架,由...

    mongodb-paris-jongo:卡塔将在巴黎MongoDB上展示Jongo

    mongodb-paris-jongo 卡塔(Kata)将在巴黎MongoDB和巴黎JUG上展示Jongo 下载mongodb 启动它克隆此存储库并运行maven命令: git clone git://github.com/bguerout/mongodb-paris-jongo.git cd mongodb-paris-jongo...

    xongo:用于 Java 的 Mongo + Fongo + Jongo

    通过 Xongo,你可以轻松地在不同环境中切换真实数据库和模拟数据库,这对于开发和测试流程来说非常有用。 在 Xongo 中,`Friend` 类是一个示例实体类,它代表了存储在数据库中的文档模型。这个类通常会包含各种字段...

    jetty-console-winsrv-plugin-1.55.zip

    Jetty Console Winsrv Plugin和Jongo都是由社区维护并持续更新的项目,它们提供了丰富的文档和示例,帮助开发者更好地理解和使用这两个工具。通过参与开源项目,开发者不仅可以提升自己的技能,还能为社区贡献自己的...

    jongo:在Java中像在Mongo Shell中一样进行查询

    Jongo,使用Java进行查询,就像在Mongo Shell中一样 诚实的精神,Mongo查询语言在Java中不可用,Jongo对此进行了修复。 将查询复制/粘贴到字符串。 面向对象,将对象保存到集合中或从集合中查找对象。 使用嵌入式...

    MongoDriverComparison:之间的比较

    它的主要优点在于其代码的可读性和简洁性,可以直接通过方法调用来完成数据库查询,例如: ```java List&lt;User&gt; users = db.getCollection("users").find("{username : '#'}", "admin").as(User.class); ``` 然而,...

    各种数据库的jdbc-driver

    虽然MongoDB本身不直接支持JDBC标准,但存在第三方库如Jongo和mongodb-jdbc来模拟JDBC接口,以便Java应用能够通过熟悉的JDBC API与MongoDB进行通信。这些驱动允许Java开发者执行CRUD操作,查询文档,甚至进行聚合...

    Java网络爬虫jar包

    在这个“Java网络爬虫jar包”中,包含了一组预先编译好的Java类库,使得开发者能够快速构建自己的网络爬虫项目。下面我们将详细探讨Java网络爬虫的关键技术和组件。 1. **HTTP请求与响应**: Java网络爬虫首先需要...

    不同数据库间的导入导出

    例如,使用JDBC的NoSQL扩展或者第三方库如Jongo(MongoDB)来实现数据迁移。 8. **安全性与合规性**:在进行数据导入导出时,必须遵守数据保护法规,确保数据的安全性和隐私。这可能涉及数据加密、权限控制和审计...

    毕业设计外文文献翻译

    在IT行业中,尤其是在Java开发领域,对象持久化(Object Persistence)...这篇外文文献的翻译对于Java开发者,尤其是正在进行毕业设计的学生来说,无疑是一份宝贵的学习资料,帮助他们更好地理解和运用对象持久化技术。

    Java数据库应用程序编程指南

    10. **NoSQL数据库支持**:除了关系型数据库,Java还支持NoSQL数据库,如MongoDB、Cassandra等,对应的有如Jongo、Java driver for MongoDB等API。 通过深入学习这些概念和实践,你将能够构建高效、可靠的Java...

    coco-2021:可可2021

    在"COCO-2021"的开发过程中,开发者可能使用了上述CSS技术来构建和美化"Jongo"相关的界面,确保其既可爱又有趣,同时兼顾功能性和易用性。通过查看"压缩包子文件的文件名称列表"中的具体内容,可以进一步了解项目的...

    java数据库编程指南.rar

    11. NoSQL数据库:Java同样支持MongoDB、Cassandra等NoSQL数据库,通过JDBC替代品如Jongo、MongoDB Java Driver等进行操作。 12. 数据库设计:理解数据库设计的基本原则,如范式理论,以及如何创建有效索引以优化...

    java数据库技术详解ppt

    这些非关系型数据库在大数据处理、高并发场景下有独特优势,Java提供了诸如Jongo、Morphia等库来简化与NoSQL数据库的交互。 总结起来,这份"java数据库技术详解ppt"涵盖了Java与数据库交互的各个方面,包括JDBC、...

    EarthQuakeMonitor:监控地震事件

    Java有JDBC用于连接关系型数据库,而Spring Data或Jongo可以方便地操作NoSQL数据库。 5. **地图可视化**:为了呈现地震的位置信息,项目可能使用地图API,如Google Maps API或OpenStreetMap。JavaFX或Java Swing...

    DatabaseDriver

    首先,让我们理解什么是JDBC(Java Database Connectivity)。JDBC是Java平台的标准API,由Java SE(标准版)提供,用于与各种类型的数据库进行通信。JDBC提供了统一的接口,让开发者可以编写与数据库无关的代码,...

    elepy:Elepy,无头内容管理框架

    Jongo是Java对MongoDB的轻量级操作库,简化了在Java应用程序中与MongoDB的交互。 此外,Elepy支持RESTful API的构建,这意味着你可以通过HTTP协议暴露数据和服务,便于与其他系统集成或构建API驱动的应用。REST...

    NHLStreams:在NRT中刮取NHL数据的应用

    Java有JDBC用于关系型数据库操作,而对NoSQL数据库则可以使用如Jongo或Spring Data MongoDB等库。数据的持久化有助于快速查询和分析历史数据。 对于数据处理和分析,Java有许多强大的库,如Apache Commons Math提供...

    Java 数据库编程宝典

    面对非关系型数据库,如MongoDB、Cassandra,Java提供了如Jongo、Datastax Java Driver等API来适应不同的数据模型。 9. 数据库优化: 学习如何分析SQL执行计划,调整索引,优化查询性能,以及如何设计高效的数据...

Global site tag (gtag.js) - Google Analytics