Mongodb简介及Spring集成

部分转载自

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()返回一个数组没有指定的字段不重复值的文件。

    从配置文件中可以看出,我建了test库,并新建了first集合。具体的数据操作就留给大家了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值