Mongodb使用json格式存储数据,不像关系型数据库用记录来表示,它是一种nosql数据库。数据存储用key:value形式存储,这样表示好处就是简单。
在项目中,有一个用户的实体User,他有很多朋友,当然他的朋友也在数据库里,为了建立关系,如果在关系数据库中我们会建立一个关系表UserFriend来表示这2个关系,这样表示的优点是结构清晰,缺点也显而易见,必须多执行一次查询才能获得好友id列表。。。而且要想更新好友关系那就更复杂了点,需要批量删除修改。。。
在mongodb里,就可以直接把好友id以数组形式加到用户信息的一个字段里了,这样在获取用户信息时,好友信息就直接获取,大大减少了查询请求,更新时也可以直接设值。这也就是为什么在互联网应用中倾向于使用nosql而不是关系型数据库的原因!简单、高效!
java的语法似乎不怎么喜欢json格式,通常定义一个对象,用setter和getter来操作数据,比较繁琐,却也不得已而为之!(相对来说,python等脚本语言用json很酷,可以直接用a["key"]来获取和设置字段值)。可惜这个项目已经用java来做了,用python估计不太可能了。
mongodb提供的java driver里,存取数据用DBObject,它使用类似map操作方法,把字段和值一个个put进去,读取的话可以用get方法,当时第一次接触,我就想到了用反射(reflect)来操作,获取pojo的每个字段值然后put到DBObject里,于是就写了个互相转化的方法,后来在项目中也就是这样使用了,可我写的这个方法只能处理简单类,字段只能为Integer,Long,String这集中类型,不支持数组和map。。做了一段时间,才发现我在用nosql
数据库实现关系数据库,因为我确实用了一个usrfriend集合来存储用户好友关系。。。
最近才若有所思的发现,我不该这么做,好友id列表应该直接放到用户信息里的。
在mongodb官网发现有很多第三方工具,其中有个morphia的项目,打开首页(http://code.google.com/p/morphia/),一目了然的看到了如何定义实体以及存储和查找,用了下比我这个方便多了,于是毫不犹豫的开始重构代码。。。
下面介绍下如何使用morphia
1.下载最新版本的morphia-xxx.jar 并且加入的 path里。
2.在pojo类用注解@Entity定义一个实体,用@Embedded定义一个潜入类。
3.可以直接存储数组,和map。非常方便的可以嵌套很多信息。原先要建关系表的,可以统统取消了。只用一个
查询就可以把所有信息返回了,在高并发时非常实用。
4.morphia提供了一个dao可以拓展或者实例化使用,我没有拓展,因为用了spring,有依赖注入关系,而拓展这
个DAO需要Datastore,在构造函数里无法给它。只有在注入完毕后我才可以给它。于是只有这样了
public void afterPropertiesSet() throws Exception {
this.ds = morphia.getDataStore() ;
dao = new DAO<T, String>(clazz, this.ds);
}
5.编写好一些常用接口:
/**
* 增加
*/
public void add(T t){
dao.save(t);
}
/**
* 创建一个查询
*/
protected Query<T> createQuery(){
return dao.createQuery();
}
/**
* 根据_id查询
*/
protected Query<T> createIdQuery(Object _id){
return dao.createQuery().field("_id").equal(_id);
}
/**
* 查找一个实体
*/
protected T findOne(Query<T> q){
return dao.findOne(q);
}
/**
* 根据_id查找
*/
public T findById(ObjectId _id){
return dao.findOne("_id", _id);
}
/**
* 可查找多个实体
*/
protected QueryResults<T> find(Query<T> q){
return dao.find(q);
}
/**
* 返回全部实体
*/
public List<T> getAll(){
return this.find(this.createQuery()).asList();
}
/**
* 分页查找
*/
protected QueryResults<T> find(Query<T> q, Page page){
if(page != null){
q.limit(page.getPageSize()).offset((page.getPageIndex() - 1) *
page.getPageSize());
page.setTotalCount((int) q.countAll());
}
return dao.find(q);
}
/**
* 删除实体
*/
protected void delete(T t){
dao.delete(t);
}
/**
* 根据查询删除
*/
protected void delete(Query<T> q){
dao.deleteByQuery(q);
}
/**
* 根据_id删除
*/
public void delById(ObjectId id){
Query<T> q = this.createIdQuery(id);
dao.deleteByQuery(q);
}
/**
* 更新
*/
protected void update(Query<T> q, UpdateOperations<T> ops){
dao.update(q, ops);
}
/**
* 已知_id进行添加就是更新覆盖
*/
public void update(T t){
dao.save(t);
}
/**
* 创建一个更新操作
*/
protected UpdateOperations<T> createUpdateOperations(){
return dao.createUpdateOperations();
}
这样,在具体使用时,直接定义一个User类,它里面的字段可以使用很多其他类,也可以使用数组,然后直接
save,而query时也会一起带出来,很方便,也可以大大较少数据库请求操作。
分享到:
相关推荐
这篇文章就是展示如何使用Java基于MongoDB和Spring Data创建一个CRUD应用。 Spring Data for MongoDB提供了一个类似于基于Sping编程模型的NoSQL数据存储。Spring Data for MongoDB提供了很多特性,它使很多MongoDB的...
java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,...
在面试中,可能会涉及到如何使用Java驱动程序连接MongoDB数据库,如何进行数据的插入、查询、更新和删除操作,如何使用聚合管道进行数据分析等问题。此外,面试官还可能会问到如何处理MongoDB的事务和并发访问等问题...
MongoDBConfig.java package com.posoftframework.mongodb; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import...
MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 再高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。
mongodb-java-examples 该项目包含Java提供的代码的示例项目。 先决条件 将安装到您选择的目录中(如果使用Windows,则不需要是...使用java MongoDB运行应用程序 项目结构 代码的结构方式使得每个MongoDB操作都有一个
本文将详细介绍如何在Spring Boot项目中集成MongoDB数据库,包括其原理、使用流程、步骤以及完整的代码示例。通过本文,读者将能够了解Spring Boot与MongoDB的集成方式,掌握在Spring Boot应用程序中操作MongoDB...
在此示例中,数据使用 MQTT 作为代理解决方案进行传输。 一旦在代理上发布,来自移动应用程序的传感器数据就会通过订阅由 node.js 应用程序接收并存储在数据库中。 公约 需求级别将根据 RFC2119(“用于在 RFC 中...
1.Mongodb数据结构,以及存储方式 2.增删改查使用,分页,排序,投影,以及多种扩展使用 3.丰富查询语句,比如算术查询,等值查询,逻辑查询,数组查询,where查询,模糊查询等 4.索引创建,游标、存储过程使用 5....
主要给大家介绍了关于MongoDB存储时间时差问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 编辑本段特点 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: *面向集合...
12.反应性MongoDB存储库 12.1。介绍 12.2。活性成分库 12.3。用法 12.4。特征 12.4.1。地理空间资源库查询 12.5。无限流与Tailable游标 13.审计 13.1。基本 13.1.1。基于注释的审计元数据 13.1.2。基于接口的审计元...
使用场景同步mongodb数据到异构存储,如:mongo -> elasticsearch业务cache刷新,如:redis中镜像数据监听数据变化,触发一些业务逻辑...现实原理实时读取oplog操作日志(副本集的复制靠的也是oplog),转化成相应的事件流...
工作网站使用的技术: Java脚本jQuery查询Node.js Express.js MongoDB的猫鼬引导程序Handlebars.js AJAX / JSON NPM软件包:Express,Mongoose,Body-parser,Express-Handlebars,Cheerio,Request作者奥扎伊尔·汗...
MongoDB 分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足 MongoDB 数据量大量增长的需求,当一台 MongoDB 服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时...
人事工资管理系统java源码1.0 MongoDB 要点 术语翻译 关系型数据库管理系统 MongoDB 数据库 数据库 桌子 收藏 排 文档 指数 指数 加入 嵌入文档、文档引用或 $lookup 以组合来自不同集合的数据 Mongo DB supports a ...
Mongo DB 是目前在IT行业非常流行的一种非关系型数据库 NoSql 其灵活的数据存储方式备受当前IT从业人员的青睐 Mongo DB很好的实现了面向对象的思想 OO思想 在Mongo DB中 每一条记录都是一个Document对象 Mongo DB...
MongoDB 是一个基于分布式文件存储的数据库。...旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
作为基于分布式文件存储的数据库,在目前的云计算实践中,MongoDB炙手可热。《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。详细而深入,对MongoDB的开发...
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: *面向集合存储,易存储对象类型的数据。 *模式自由。 *支持动态查询。 *支持完全索引,包含内部对象。 *支持查询。 *支持复制和故障恢复。 ...