MongoDB的spring整合使用

1、首先,引入包,

		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-mongodb</artifactId>
			<version>1.10.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.mongodb</groupId>
			<artifactId>mongo-java-driver</artifactId>
			<version>3.4.3</version>
		</dependency>

 2、配置,可查看官方文档

mongodb.host=127.0.0.1
mongodb.port=27017
mongodb.databaseName=testliu
mongodb.username=liu
mongodb.password=123
mongodb.connectionsPerHost=8
mongodb.threadsAllowedToBlockForConnectionMultiplier=4
mongodb.connectTimeout=1000
mongodb.maxWaitTime=1500
mongodb.autoConnectRetry=true
mongodb.socketKeepAlive=true
mongodb.socketTimeout=1500
mongodb.slaveOk=true
mongodb.writeNumber=1
mongodb.riteTimeout=0
mongodb.writeFsync=true

 

	<mongo:db-factory id="mongoDbFactory"
                  host="${mongodb.host}"
                  port="${mongodb.port}"
                  dbname="${mongodb.databaseName}"
                  username="${mongodb.username}"
                  password="${mongodb.password}"/>

	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
	</bean>

 3、写单元测试:

    @Before
    public void testBefore() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-mongodb.xml");
        mongoTemplate = (MongoTemplate) context.getBean("mongoTemplate");
    }


    @Test
    public void testAdd() {
        UserVo user = new UserVo(16,"liu");
        mongoTemplate.save(user);
    }

 4、遇到问题,MongoDB默认是没有鉴权,所以任意访问,而spring连接时会报错误,这个时候,只需要新建一个用户名+密码,分配读写权限即可,我的客户端用的mongochef,比较简单。

org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='', source='testliu', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server 127.0.0.1:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='', source='testliu', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server 127.0.0.1:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }}}]
	at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:77)
	at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2146)
	at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:484)
	at org.springframework.data.mongodb.core.MongoTemplate.saveDBObject(MongoTemplate.java:1104)
	at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1037)
	at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:984)
	at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:972)
	at com.test.MongoSpringTest.testAdd(MongoSpringTest.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)

 

拓展:

1)查询时,一般使用Query和Criteria对象,聚合使用Aggregation(),

Aggregation aggregation = Aggregation.newAggregation(
				Aggregation.match(criteria),
				Aggregation.group(Fields.field("userId", "_id.userId"))).sum("num").as("sum").sum("mNum").as("mSum")...)
 2、使用map-reduce分析数据时,分为几方面,
Query query = new Query();
query.addCriteria(Criteria.where("userId").is(1));
//mapReduceOptions定义了分析后的数据,存储的表位置
MapReduceOptions mapReduceOptions = new MapReduceOptions().outputTypeMerge().outputCollection(tableName).finalizeFunction("classpath:finalize.js");
mongoTemplate.mapReduce(query, CollectionName.ORDER,
				"classpath:map.js",
				"classpath:reduce.js", 
                                mapReduceOptions,
				entityClass);
 其中map定义的分组的方式,reduce定义了如何处理数据。
官方教程(按用户名分组,累计每个用户的记录):
>db.posts.mapReduce( 
   function() { emit(this.user_name,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
).find()
 
map.js  
function(){  
    emit({  
            user_name: this.user_name,  
            user_Id: this.user_Id,  
        },  
        {  
            count: this.count,  
            ip: this.ip,  
            money: this.money,  
        })  
}  
reduce.js  
function(key, values){  
    reduced = {totalCount:0,ip:'',totalMoney:0};  
    values.forEach(function (val) {  
        reduced.ip= val.ip;  
        reduced.totalCount += val.count;  
        reduced.totalMoney += val.money;  
    });  
    return reduced;  
} 
 

猜你喜欢

转载自1181731633.iteye.com/blog/2394704