`
wjjxf
  • 浏览: 237623 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java使用mongodb存储数据

阅读更多
    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时也会一起带出来,很方便,也可以大大较少数据库请求操作。
2
0
分享到:
评论
2 楼 wjjxf 2011-01-07  
xiaoxin5230 写道
请问博主,这个有用到过实际项目中吗?

嗯,正在用
1 楼 xiaoxin5230 2011-01-07  
请问博主,这个有用到过实际项目中吗?

相关推荐

    使用Java基于MongoDB和SpringData应用.docx

    这篇文章就是展示如何使用Java基于MongoDB和Spring Data创建一个CRUD应用。 Spring Data for MongoDB提供了一个类似于基于Sping编程模型的NoSQL数据存储。Spring Data for MongoDB提供了很多特性,它使很多MongoDB的...

    java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言:  MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。  MongoDB是一个介于关系数据库和非关系数据库之间的产品,...

    Java开发面试-MongoDB专区

    在面试中,可能会涉及到如何使用Java驱动程序连接MongoDB数据库,如何进行数据的插入、查询、更新和删除操作,如何使用聚合管道进行数据分析等问题。此外,面试官还可能会问到如何处理MongoDB的事务和并发访问等问题...

    Java操作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...

    Java面试MongoDB.pdf

    MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 再高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。

    mongodb-java-examples:如何在Java中使用MongoDB的示例

    mongodb-java-examples 该项目包含Java提供的代码的示例项目。 先决条件 将安装到您选择的目录中(如果使用Windows,则不需要是...使用java MongoDB运行应用程序 项目结构 代码的结构方式使得每个MongoDB操作都有一个

    Spring Boot使用MongoDB详解

    本文将详细介绍如何在Spring Boot项目中集成MongoDB数据库,包括其原理、使用流程、步骤以及完整的代码示例。通过本文,读者将能够了解Spring Boot与MongoDB的集成方式,掌握在Spring Boot应用程序中操作MongoDB...

    mongodb-iot-mqtt-example:如何使用 MongoDB 存储 IoT 数据的示例

    在此示例中,数据使用 MQTT 作为代理解决方案进行传输。 一旦在代理上发布,来自移动应用程序的传感器数据就会通过订阅由 node.js 应用程序接收并存储在数据库中。 公约 需求级别将根据 RFC2119(“用于在 RFC 中...

    Mongodb最佳实践

    1.Mongodb数据结构,以及存储方式 2.增删改查使用,分页,排序,投影,以及多种扩展使用 3.丰富查询语句,比如算术查询,等值查询,逻辑查询,数组查询,where查询,模糊查询等 4.索引创建,游标、存储过程使用 5....

    MongoDB存储时间时差问题的解决方法

    主要给大家介绍了关于MongoDB存储时间时差问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    MongoDB 1.0

    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 编辑本段特点  它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: *面向集合...

    springMongodb参考文档中文版

    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-trigger:mongodb事件触发器

    使用场景同步mongodb数据到异构存储,如:mongo -&gt; elasticsearch业务cache刷新,如:redis中镜像数据监听数据变化,触发一些业务逻辑...现实原理实时读取oplog操作日志(副本集的复制靠的也是oplog),转化成相应的事件流...

    mongo-scraper:刮新闻文章,并使用MongoDb存储有关文章的数据

    工作网站使用的技术: Java脚本jQuery查询Node.js Express.js MongoDB的猫鼬引导程序Handlebars.js AJAX / JSON NPM软件包:Express,Mongoose,Body-parser,Express-Handlebars,Cheerio,Request作者奥扎伊尔·汗...

    详解MongoDB4.0构建分布式分片群集

    MongoDB 分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足 MongoDB 数据量大量增长的需求,当一台 MongoDB 服务器不足以存储海量数据或不足以提供可接受的读写吞吐量时...

    人事工资管理系统java源码-DW-using-MongoDB:使用MongoDB设计数据仓库所需的所有信息

    人事工资管理系统java源码1.0 MongoDB 要点 术语翻译 关系型数据库管理系统 MongoDB 数据库 数据库 桌子 收藏 排 文档 指数 指数 加入 嵌入文档、文档引用或 $lookup 以组合来自不同集合的数据 Mongo DB supports a ...

    Spring4 整合MongoDB详细讲解项目源码

    Mongo DB 是目前在IT行业非常流行的一种非关系型数据库 NoSql 其灵活的数据存储方式备受当前IT从业人员的青睐 Mongo DB很好的实现了面向对象的思想 OO思想 在Mongo DB中 每一条记录都是一个Document对象 Mongo DB...

    MongoDB视频两套

    MongoDB 是一个基于分布式文件存储的数据库。...旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    作为基于分布式文件存储的数据库,在目前的云计算实践中,MongoDB炙手可热。《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。详细而深入,对MongoDB的开发...

    MongoDB最新安装包( Winslow32)

    它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: *面向集合存储,易存储对象类型的数据。 *模式自由。 *支持动态查询。 *支持完全索引,包含内部对象。 *支持查询。 *支持复制和故障恢复。 ...

Global site tag (gtag.js) - Google Analytics