Mongodb简介及Spring集成
2015-04-15 11:19
260 查看
部分转载自
b)高效的传统存储方式:支持二进制数据及大型对象(如照片和视频)。
c)复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。
d)Auto-Sharding自动分片支持云级扩展性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
e)动态查询:它支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
f)全索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
g)支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
b)适合作为信息基础设施的持久化缓存层。
c)适合由数十或数百台服务器组成的数据库。因为Mongo已经包含对MapReduce引擎的内置支持。
d)Mongo的BSON数据格式非常适合文档化格式的存储及查询。
b)传统的商业智能应用。
c)级为复杂的SQL查询。
实际上,集成spring后mongodb原本自由的格式,被强制统一到spring的通用使用方式上,template的使用类似于ORM框架,映射关系不想原生的bson格式灵活,建议还是直接用mongo-java-driver去做。
spring的底层实现也是mongo-java-driver,该包自带了连接池内有默认配置为100。
mongodb的安装就不说了,本人装在192.168.235.135的ubuntu虚拟机上。外部连接需要放开/etc/mongod.conf 的bind_ip属性限制
从配置文件中可以看出,我建了test库,并新建了first集合。具体的数据操作就留给大家了。
1 MongoDB简介
MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写,旨在为WEB应用提供可护展的高性能数据存储解决方案。它的特点是可扩展,高性能,易使用,模式自由,存储数据非常方便等。1.1 主要功能特性
a)面向文档存储:(类JSON数据模式简单而强大)。b)高效的传统存储方式:支持二进制数据及大型对象(如照片和视频)。
c)复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。
d)Auto-Sharding自动分片支持云级扩展性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
e)动态查询:它支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
f)全索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
g)支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
1.2 适用场景
a)适合实时的插入,更新与查询,并具备应用程序实时数据存储所需的复制及高度伸缩性。b)适合作为信息基础设施的持久化缓存层。
c)适合由数十或数百台服务器组成的数据库。因为Mongo已经包含对MapReduce引擎的内置支持。
d)Mongo的BSON数据格式非常适合文档化格式的存储及查询。
1.3 不适用场景
a)高度事务性的系统。b)传统的商业智能应用。
c)级为复杂的SQL查询。
1.4 其他使用场景参考
1.4.1你期望一个更高的写负载
默认情况下,对比事务安全,MongoDB更关注高的插入速度。如果你需要加载大量低价值的业务数据,那么MongoDB将很适合你的用例。但是必须避免在要求高事务安全的情景下使用MongoDB,比如一个1000万美元的交易。1.4.2不可靠环境保证高可用性
设置副本集(主-从服务器设置)不仅方便而且很快,此外,使用MongoDB还可以快速、安全及自动化的实现节点(或数据中心)故障转移。1.4.3未来会有一个很大的规模
数据库扩展是非常有挑战性的,当单表格大小达到5-10GB时,MySQL表格性能会毫无疑问的降低。如果你需要分片并且分割你的数据库,MongoDB将很容易实现这一点。1.4.4使用基于位置的数据查询
MongoDB支持二维空间索引,因此可以快速及精确的从指定位置获取数据。1.4.5非结构化数据的爆发增长
给RDBMS增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,这个问题通常发生在表格大于1GB(更是下文提到BillRun系统中的痛点——单表格动辄几GB)的情况下。鉴于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速;因此,在应用程序发生改变时,你不需要专门的1个DBA去修改数据库模式。2 与spring配置集成
2.1 包结构
2.2pom文件配置
<dependencies> <dependency> <groupId>com.qfang</groupId> <artifactId>qfang-model</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.13.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.6.2.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.1.0.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies>
2.3 spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.qfang.mongo" /> <mongo:mongo host="192.168.235.135" port="27017" /> <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 --> <mongo:db-factory dbname="test" mongo-ref="mongo" /> <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean> <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 --> <mongo:mapping-converter base-package="com.qfang.mongo" /> <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 --> <mongo:repositories base-package="com.qfang.mongo" /> <context:annotation-config /> </beans>
2.4集合映射类
package com.qfang.mongo.model; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; /** * 集合映射 * @author yoara */ @Document(collection="first") public class First { @Id private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.5 数据操作
package com.qfang.mongo; public interface FirstDao { long count(); }
package com.qfang.mongo.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Repository; import com.qfang.mongo.FirstDao; import com.qfang.mongo.model.First; @Repository("firstDao") public class FirstDaoImpl implements FirstDao{ @Autowired private MongoTemplate mongoTemplate; public long count() { Query q = new Query(); return mongoTemplate.count(q, First.class); } }
2.6 测试用例
package com.qfang.mongo; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:applicationContext-mongo-test.xml"}) public class AbstractTest { @Before public void setUp(){ } }
package com.qfang.mongo.impl; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.qfang.mongo.AbstractTest; import com.qfang.mongo.FirstDao; public class FirstDaoImplTest extends AbstractTest{ @Autowired private FirstDao firstDao; @Test public void testCount() { Assert.assertEquals(2l, firstDao.count()); } }
实际上,集成spring后mongodb原本自由的格式,被强制统一到spring的通用使用方式上,template的使用类似于ORM框架,映射关系不想原生的bson格式灵活,建议还是直接用mongo-java-driver去做。
spring的底层实现也是mongo-java-driver,该包自带了连接池内有默认配置为100。
3 mongodb使用
上面的环境搭建好后,测试用例要跑起来还是需要数据。mongodb的安装就不说了,本人装在192.168.235.135的ubuntu虚拟机上。外部连接需要放开/etc/mongod.conf 的bind_ip属性限制
3.1 mongodb常用命令
查询游标方法名称 | 说明 |
cursor.count() | 返回游标中的文档的数量。 |
cursor.explain() | 报告的查询执行计划,包括索引使用的游标。 |
cursor.hint() | 若要使用查询的特定索引的部队 MongoDB。 |
cursor.limit() | 约束游标的结果集的大小。 |
cursor.next() | 返回游标中的下一个文档。 |
cursor.skip() | 返回一个游标,开始传递或跳过的一些文件后才返回结果。 |
cursor.sort() | 返回结果排序根据排序的规范。 |
cursor.toArray() | 返回一个数组,包含由光标返回的所有文档。 |
名称 | 说明 |
db.collection.insert() | 在集合中创建一个新文档。 |
db.collection.save() | 提供insert()和update ()插入新文件的包装。 |
db.collection.update() | 修改集合中的文档。 |
db.collection.find() | 集合上执行查询,并返回一个游标对象。 |
db.collection.findOne() | 执行查询,并返回一个单独的文档。 |
db.collection.remove() | 从集合中删除的文件。 |
db.collection.count() | 换行计数集合或匹配查询中返回的文档数的计数。 |
db.collection.distinct() | 返回一个数组没有指定的字段不重复值的文件。 |
相关文章推荐
- Spring DAO(6): 集成 MongoDB(spring-data-mongo)
- spring集成mongodb
- Spring Data 与MongoDB 集成三:操作篇(修改)
- MongoDB学习日记 - Spring框架集成 : spring-data-mongodb
- mongodb java api常用方法的使用以及和spring的集成使用
- spring MongoDB 集成(分页)
- Spring 集成mongodb
- springBoot集成MongoDB
- Spring+SpringMVC+Mybatis框架集成Apache CXF2.7集成 mongodb集成quartz
- Redis简介-安装-Spring-SpringBoot集成教程
- spring同时集成redis和mongodb时遇到多个资源文件加载的问题
- spring MongoDB 集成(分页)
- MongoDB的Spring-data-mongodb集成(Win10 x64) 第一章 - MongoDB安装与简单命令
- MongoDB集成Spring Data
- Mongodb与spring集成(1)------配置
- Spring集成MongoDB及操作
- MongoDB集成Spring Data
- (三)spring-boot集成MongoDB
- Spring Data 与MongoDB 集成四:操作篇(查询)
- 微服务,微架构[三]之springboot集成nosql数据库mongodb