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; }