配置文件application-dev.yml:
server:
port: 8888
mongo:
host: localhost
port: 27017
timeout: 60000
db: mamabike
配置类MongoDBConfiguration:
package com.tangzhe.configuration;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import com.tangzhe.autoid.SaveMongoEventListener;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
/**
* Created by 唐哲
* 2018-03-13 17:20
* MongoDB配置
*/
@Configuration
@ConfigurationProperties(prefix = "mongo")
@Data
public class MongoDBConfiguration {
//mongodb服务地址
private String host;
//mongodb服务端口号
private Integer port;
//连接超时
private Integer timeout;
//mongodb数据库名
private String db;
/**
* 配置MongoDB模板
*/
@Bean
public MongoTemplate mongoTemplate(SimpleMongoDbFactory mongoDbFactory,
MappingMongoConverter mappingMongoConverter) {
return new MongoTemplate(mongoDbFactory, mappingMongoConverter);
}
/**
* 配置自增ID监听器
*/
@Bean
public SaveMongoEventListener saveMongoEventListener() {
return new SaveMongoEventListener();
}
/**
* 配置GridFs模板,实现文件上传下载
*/
@Bean
public GridFsTemplate gridFsTemplate(SimpleMongoDbFactory mongoDbFactory,
MappingMongoConverter mappingMongoConverter) {
return new GridFsTemplate(mongoDbFactory, mappingMongoConverter);
}
/**
* 配置mongoDbFactory
*/
@Bean
public SimpleMongoDbFactory mongoDbFactory() {
MongoClientOptions options = MongoClientOptions.builder().connectTimeout(timeout).build();
MongoClient client = new MongoClient(new ServerAddress(host, port), options);
return new SimpleMongoDbFactory(client, db);
}
/**
* 配置mongoMappingContext
*/
@Bean
public MongoMappingContext mongoMappingContext() {
return new MongoMappingContext();
}
/**
* 配置defaultMongoTypeMapper
*/
@Bean
public DefaultMongoTypeMapper defaultMongoTypeMapper() {
//去掉_class字段
return new DefaultMongoTypeMapper(null);
}
/**
* 配置mappingMongoConverter
*/
@Bean
public MappingMongoConverter mappingMongoConverter(SimpleMongoDbFactory mongoDbFactory,
MongoMappingContext mongoMappingContext,
DefaultMongoTypeMapper defaultMongoTypeMapper) {
MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(mongoDbFactory, mongoMappingContext);
mappingMongoConverter.setTypeMapper(defaultMongoTypeMapper);
return mappingMongoConverter;
}
}
测试类:
1 package com.tangzhe.mongodb; 2 3 import org.junit.runner.RunWith; 4 import org.springframework.boot.test.context.SpringBootTest; 5 import org.springframework.test.context.junit4.SpringRunner; 6 7 /** 8 * Created by 唐哲 9 * 2018-03-13 17:25 10 */ 11 @RunWith(SpringRunner.class) 12 @SpringBootTest 13 public class BaseTest { 14 }
实体类:
1 package com.tangzhe.mongodb; 2 3 import lombok.Data; 4 import org.springframework.data.annotation.Id; 5 import org.springframework.data.mongodb.core.mapping.Document; 6 import org.springframework.data.mongodb.core.mapping.Field; 7 8 import java.util.Date; 9 import java.util.List; 10 11 /** 12 * Created by 唐哲 13 * 2018-03-13 17:40 14 */ 15 @Document(collection = "article_info") 16 @Data 17 public class Article { 18 19 @Id 20 private String id; 21 22 @Field("title") 23 private String title; 24 25 @Field("v_count") 26 private Long visitCount; 27 28 @Field("tags") 29 private List<String> tags; 30 31 @Field("add_time") 32 private Date addTime; 33 34 }
测试mongodbTemplate:
1 package com.tangzhe.mongodb.mongotemplate; 2 3 import com.tangzhe.mongodb.Article; 4 import com.tangzhe.mongodb.BaseTest; 5 import org.bson.types.ObjectId; 6 import org.junit.Test; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.data.mongodb.core.MongoTemplate; 9 import org.springframework.data.mongodb.core.query.Criteria; 10 import org.springframework.data.mongodb.core.query.Query; 11 import org.springframework.data.mongodb.core.query.Update; 12 13 import java.util.ArrayList; 14 import java.util.Arrays; 15 import java.util.Date; 16 import java.util.List; 17 18 /** 19 * Created by 唐哲 20 * 2018-03-13 17:27 21 */ 22 public class MongoTemplateTest extends BaseTest { 23 24 @Autowired 25 private MongoTemplate mongoTemplate; 26 27 /** 28 * 查询某数据库中所有集合(表) 29 */ 30 //@Test 31 public void findAllCollections() { 32 mongoTemplate.getCollectionNames().forEach(System.out::println); 33 } 34 35 /** 36 * 批量插入数据 37 */ 38 //@Test 39 public void insertBatch() { 40 List<Article> datas = new ArrayList<>(); 41 for(int i=0; i<10; i++) { 42 Article article = new Article(); 43 article.setTitle("猿天地实战课程" + i); 44 article.setVisitCount(10L); 45 article.setTags(Arrays.asList("java", "python", "c#")); 46 article.setAddTime(new Date()); 47 datas.add(article); 48 } 49 50 mongoTemplate.insert(datas, Article.class); 51 } 52 53 /** 54 * 修改数据 55 */ 56 @Test 57 public void update() { 58 //根据title修改 59 // mongoTemplate.updateFirst( 60 // Query.query( 61 // new Criteria("title").is("猿天地实战课程0") 62 // ), 63 // Update.update("visitCount", 100L), 64 // Article.class 65 // ); 66 67 //存在就修改不存在就插入 68 // mongoTemplate.upsert( 69 // Query.query( 70 // new Criteria("title").is("猿天地实战课程10") 71 // ), 72 // Update.update("visitCount", 200L), 73 // Article.class 74 // ); 75 76 //修改title,并将visitCount加1 77 // mongoTemplate.updateFirst( 78 // Query.query( 79 // new Criteria("title").is("猿天地实战课程0") 80 // ), 81 // Update.update("title", "猿天地实战课程").inc("visitCount", 1), 82 // Article.class 83 // ); 84 85 //如果传入的是集合名称,则需要写苦衷原始的key名称,如果是实体类就写类中的字段名称 86 // mongoTemplate.updateFirst( 87 // Query.query( 88 // new Criteria("title").is("猿天地实战课程") 89 // ), 90 // Update.update("v_count", 1L), 91 // "article_info" 92 // ); 93 94 //删除key 95 mongoTemplate.updateFirst( 96 Query.query( 97 new Criteria("title").is("猿天地实战课程") 98 ), 99 new Update().unset("visitCount"), 100 Article.class 101 ); 102 } 103 104 /** 105 * 删除数据 106 */ 107 @Test 108 public void delete() { 109 // mongoTemplate.remove( 110 // Query.query( 111 // Criteria.where("title").is("猿天地实战课程") 112 // ), 113 // Article.class 114 // ); 115 116 //删除一条,并且返回这条数据 117 Article article = mongoTemplate.findAndRemove( 118 Query.query( 119 Criteria.where("title").is("猿天地实战课程10") 120 ), 121 Article.class 122 ); 123 System.out.println(article); 124 125 //批量删除,并且返回数据列表 126 List<Article> articles = mongoTemplate.findAllAndRemove( 127 Query.query( 128 Criteria.where("title").is("猿天地实战课程10") 129 ), 130 Article.class 131 ); 132 133 //删除集合(表)的两种方式 134 mongoTemplate.dropCollection(Article.class); 135 mongoTemplate.dropCollection("article_info"); 136 137 //删除数据库 138 mongoTemplate.getDb().dropDatabase(); 139 } 140 141 /** 142 * 查询数据 143 */ 144 @Test 145 public void select() { 146 //数量查询 147 long count = mongoTemplate.count( 148 Query.query( 149 Criteria.where("visitCount").is(10) 150 ), 151 Article.class 152 ); 153 System.out.println(count); 154 155 //查询第一条 156 Article article = mongoTemplate.findOne( 157 Query.query( 158 Criteria.where("visitCount").is(10) 159 ), 160 Article.class 161 ); 162 System.out.println(article); 163 164 //查询所有 165 List<Article> articles = mongoTemplate.findAll(Article.class); 166 System.out.println(articles.size()); 167 168 //带条件查询 169 mongoTemplate.find( 170 Query.query( 171 Criteria.where("visitCount").is(100) 172 ), 173 Article.class 174 ); 175 176 //如果在大数据量的情况下,最好是排序,记住你上次最后一条数据的ID, 177 //然后就是大于上次的ID,然后limit页数 178 articles = mongoTemplate.find( 179 Query.query( 180 Criteria.where("visitCount").is(100) 181 ).skip(0).limit(10), 182 Article.class 183 ); 184 System.out.println(articles.size()); 185 186 //根据ID查询 187 mongoTemplate.findById(new ObjectId("5aa79ddecdb51518c073a247"), Article.class); 188 189 //in查询 190 articles = mongoTemplate.find( 191 Query.query( 192 Criteria.where("visitCount").in(100, 200, 300) 193 ), 194 Article.class 195 ); 196 System.out.println(articles.size()); 197 198 //or查询 199 articles = mongoTemplate.find( 200 Query.query( 201 new Criteria().orOperator( 202 Criteria.where("visitCount").is(100), 203 Criteria.where("visitCount").is(200), 204 Criteria.where("visitCount").is(300) 205 ) 206 ), 207 Article.class 208 ); 209 System.out.println(articles.size()); 210 } 211 212 }