【MongoDB】spring-data-mongo配置

  • config.properties
#mongodb setting
mongo.host=127.0.0.1
mongo.port=27017
mongo.connectionsPerHost=100
mongo.threadsAllowedToBlockForConnectionMultiplier=50
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=0
mongo.slaveOk=true
  • spring_mongo.xml
<!--引入配置属性文件 -->
<context:property-placeholder location="classpath:db.properties" />

<!-- mongodb配置 -->
<mongo:mongo id="mongo" replica-set="${mongo.replica-set}" write-concern="SAFE">
	<mongo:options 
		connections-per-host="${mongo.connectionsPerHost}"
		threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
		connect-timeout="${mongo.connectTimeout}" 
		max-wait-time="${mongo.maxWaitTime}"
		auto-connect-retry="${mongo.autoConnectRetry}" 
		socket-keep-alive="${mongo.socketKeepAlive}"
		socket-timeout="${mongo.socketTimeout}" 
		slave-ok="${mongo.slaveOk}"
		write-number="1" 
		write-timeout="0" 
		write-fsync="true" 
	/>
</mongo:mongo>

<!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
<mongo:db-factory id="mongoDbFactory" dbname="uba" mongo-ref="mongo" />

<!-- 读写分离级别配置  -->
<!-- 首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。 -->
<bean id="primaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.PrimaryPreferredReadPreference"></bean>
<!-- 最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。  -->
<bean id="nearestReadPreference" class="com.mongodb.TaggableReadPreference.NearestReadPreference"></bean>
<!-- 从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。存在的问题是secondary节点的数据会比primary节点数据旧。  -->
<bean id="secondaryReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryReadPreference"></bean>
<!-- 优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据  -->
<bean id="secondaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryPreferredReadPreference"></bean>

<!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
	<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
	<property name="readPreference" ref="primaryPreferredReadPreference" />
</bean>

<!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 -->
<mongo:mapping-converter base-package="dev.lzq.uba.mongo.model" />

<!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
<mongo:repositories base-package="dev.lzq.uba.mongo.dao" />
  • entity
@Document(collection = "user")
public class User 
{
	@Id
	private int id;
	private String name;
	private int age;
	private String city;
	private String mote;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getMote() {
		return mote;
	}
	public void setMote(String mote) {
		this.mote = mote;
	}

}
  • dao配置
public interface MGUserDao extends MongoRepository<User, ObjectId>
{
	/**
	 * 方法名的严格遵守规定
	 * @param age
	 * @param page
	 * @return
	 */
	public Page<User> findByAgeGreaterThan(int age, Pageable page);

	/**
	 * 有@Query声明查询, 方法名不需要严格遵守规定
	 * @param name
	 * @param ageFrom
	 * @param ageTo
	 * @param pageable
	 * @return
	 */
	@Query("{‘name‘:{‘$regex‘:?0}, ‘age‘: {‘$gte‘:?1,‘$lte‘:?2}}")
	public Page<User> findByNameAndAgeRange(String name, int ageFrom, int ageTo, Pageable pageable);

	@Query("{?0:?1}")
	public List<User> findByAttribute(String key, String value);
}
  • dao层的使用

MongoRepository实现了的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable对象,返回Page集合。 例如:

//查询大于age的数据 
public Page<Product> findByAgeGreaterThan(int age,Pageable page) ;

下面是支持的查询类型,每三条数据分别对应:(方法后缀,方法例子,mongodb原生查询语句)

GreaterThan(大于) 
findByAgeGreaterThan(int age) 
{"age" : {"$gt" : age}}

LessThan(小于) 
findByAgeLessThan(int age) 
{"age" : {"$lt" : age}}

Between(在...之间) 
findByAgeBetween(int from, int to) 
{"age" : {"$gt" : from, "$lt" : to}}

IsNotNull, NotNull(是否非空) 
findByFirstnameNotNull() 
{"age" : {"$ne" : null}}

IsNull, Null(是否为空) 
findByFirstnameNull() 
{"age" : null}

Like(模糊查询) 
findByFirstnameLike(String name) 
{"age" : age} ( age as regex)

(No keyword) findByFirstname(String name) 
{"age" : name}

Not(不包含) 
findByFirstnameNot(String name) 
{"age" : {"$ne" : name}}

Near(查询地理位置相近的) 
findByLocationNear(Point point) 
{"location" : {"$near" : [x,y]}}

Within(在地理位置范围内的) 
findByLocationWithin(Circle circle) 
{"location" : {"$within" : {"$center" : [ [x, y], distance]}}}

Within(在地理位置范围内的) 
findByLocationWithin(Box box) 
{"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}

尽管以上查询功能已经很丰富,但如果还不能满足使用情况的话可以用一下方法---基于mongodb原本查询语句的查询方式。

例一:在原接口中加入,注释Query里面的就是mongodb原来的查询语法,我们可以定义传进来的查询参数,通过坐标定义方法的参数。

@Query("{ ‘name‘:{‘$regex‘:?2,‘$options‘:‘i‘}, sales‘: {‘$gte‘:?1,‘$lte‘:?2}}")
public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);

例二:还可以在后面指定要返回的数据字段,如上面的例子修改如下,则只通过person表里面的name和age字段构建person对象。

@Query(value="{ ‘name‘:{‘$regex‘:?2,‘$options‘:‘i‘}, sales‘:{‘$gte‘:?1,‘$lte‘:?2}}",fields="{ ‘name‘ : 1, ‘age‘ : 1}") 
public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
时间: 2024-12-25 19:20:53

【MongoDB】spring-data-mongo配置的相关文章

spring 集成mongo配置

spring继承Mongo使用的是spring-data. 如果需要加入两个mongo与spring集成的包,spring-data-commons-1.7.0.RELEASE.jar,spring-data-mongodb-1.4.0.RELEASE.jar. mongo的配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.

Spring Data Jpa配置

Spring Data JPA提供的接口,也是Spring Data JPA的核心概念: 1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别. 2:CrudRepository :是Repository的子接口,提供CRUD的功能 3:PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能 4:JpaRepository:是PagingAndSortingR

记录分享公司Spring data相关配置

起因 公司Spring Data相关的配置还是有点意思的,不过蛮复杂的...XML很多...我不太喜欢强行记住....所以我打算记录一下配置的大致思路和结构,以后可能会有用.... 总体结构 总体结构大致就是这样..Spring/data这个文件夹主要配置Spring Data相关的配置. data下主要有2个文件夹:datasource和module,还有一些其他的XML和properties XML和properties data-context.xml <import resource=&qu

Spring Data学习中心

Spring Data 概览 Spring Data的使命是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性. 它使数据访问技术,关系数据库和非关系数据库,map-reduce框架和基于云的数据服务变得简单易用. 这是一个伞形项目,其中包含许多特定于给定数据库的子项目. 这些项目是通过与这些激动人心的技术背后的许多公司和开发人员合作开发的. ----------- 星云解读: 众所周知,数据库大体上可以分为关系型数据库和非关系型数据库. 数据库种类繁多,为了

Spring Data JPA例子[基于Spring Boot、Mysql]

关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如编写数据查询语句.DAO类等,我们仅需要编写一些抽象接口并定义相关操作即可,Spring会在运行期间的时候创建代理实例来实现我们接口中定义的操作. 关于Spring Data子项目 Spring Data拥有很多子项目,除了Spring Data Jpa外,还有如下子项目. Spring Data Comm

快速搭建springmvc+spring data jpa工程

一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblogs.com/hujunzheng/p/5450255.html 三.配置文件说明 1.application.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springdata?u

Spring Data操作Redis详解

Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis进行了很好的封装,用起来也是十分的得心应手.Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted se

spring + springMVC + spring Data + jpa + maven 项目框架搭建

首先看一下项目结构: 所用到的jar(pom.xml): <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xs

[Spring Data MongoDB]学习笔记--注册一个Mongo实例

1. 通过Java based bean metadata @Configuration public class AppConfig { public @Bean Mongo mongo() throws UnknownHostExceptioin { return new Mongo("localhost"); } } 上面的方式包含异常处理,这并不是我们想要的. 所以,应该尽量用下面这种方式MongoFactoryBean,或者后面的xml方式. @Configuration p

[Spring Data MongoDB]学习笔记--建立数据库的连接

1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoDbFactory { DB getDb() throws DataAccessException; DB getDb(String dbName) throws DataAccessException; } 然后我们可以继续用MongoDbFactory来创建MongoTemplate的实例. pu