在Spring Boot中集成Mongodb很是简单,只须要加入Mongodb的Starter包便可,代码以下:java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
复制代码
而后配置Mongodb的链接信息:mysql
spring.data.mongodb.uri=mongodb://192.168.0.13/test 复制代码
完整配置信息请参考下面:spring
spring.data.mongodb.authentication-database= # Authentication database name. spring.data.mongodb.database= # Database name. spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use. spring.data.mongodb.grid-fs-database= # GridFS database name. spring.data.mongodb.host= # Mongo server host. Cannot be set with URI. spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI. spring.data.mongodb.port= # Mongo server port. Cannot be set with URI. spring.data.mongodb.repositories.type=auto # Type of Mongo repositories to enable. spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials. spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI. 复制代码
配置好了以后就直接能够注入MongoTemplate操做数据了sql
首先建立一个实体类,咱们这边用文章来作实体类,定义以下字段:mongodb
import java.util.Date; import java.util.List; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; /** * 文章信息 * @author yinjihuan * */ @Document(collection = "article_info") public class Article { @Id private String id; @Field("title") private String title; @Field("url") private String url; @Field("author") private String author; @Field("tags") private List<String> tags; @Field("visit_count") private Long visitCount; @Field("add_time") private Date addTime; //省略get set方法 } 复制代码
实体类中的注解解释以下: 1.Document注解标识这是一个文档,等同mysql中的表,collection值表示mongodb中集合的名称,不写默认为实体类名article。 2.Id注解为主键标识 3.Field注解为字段标识,指定值为字段名称,这边有个小技巧,之全部spring-data.mongodb中有这样的注解,是为了可以让用户自定义字段名称,能够和实体类不一致,还有个好处就是能够用缩写,好比username咱们能够配置成unane或者un,这样的好处是节省了存储空间,mongodb的存储方式是key value形式的,每一个key就会重复存储,key其实就占了很大一份存储空间。数据库
接下来能够操做数据库了,接着上次,在测试类里写代码数组
@Autowired private MongoTemplate mongoTemplate; /** * 初始化文章信息 * @author yinjihuan */ public static void initArticle() { //循环添加 for (int i = 0; i < 10; i++) { Article article = new Article(); article.setTitle("MongoTemplate的基本使用"); article.setAuthor("yinjihuan"); article.setUrl("http://cxytiandi.com/blog/detail/" + i); article.setTags(Arrays.asList("java", "mongodb", "spring")); article.setVisitCount(0L); article.setAddTime(new Date()); mongoTemplate.save(article); } //批量添加 List<Article> articles = new ArrayList<>(10); for (int i = 0; i < 10; i++) { Article article = new Article(); article.setTitle("MongoTemplate的基本使用"); article.setAuthor("yinjihuan"); article.setUrl("http://cxytiandi.com/blog/detail/" + i); article.setTags(Arrays.asList("java", "mongodb", "spring")); article.setVisitCount(0L); article.setAddTime(new Date()); articles.add(article); } mongoTemplate.insert(articles, Article.class); } 复制代码
在数据量大的状况下批量添加性能会更好哦。bash
//删除author为yinjihuan的数据 Query query = Query.query(Criteria.where("author").is("yinjihuan")); mongoTemplate.remove(query, Article.class); 复制代码
//若是实体类中没配集合名词,可在删除的时候单独指定article_info query = Query.query(Criteria.where("author").is("yinjihuan")); mongoTemplate.remove(query, "article_info"); 复制代码
//删除集合,可传实体类,也能够传名称 mongoTemplate.dropCollection(Article.class); mongoTemplate.dropCollection("article_info"); 复制代码
//删除数据库
mongoTemplate.getDb().dropDatabase();
复制代码
下面这2种适合要知道删除的数据有哪些的场景,好比记录删除的记录微信
//查询出符合条件的第一个结果,并将符合条件的数据删除,只会删除第一条 query = Query.query(Criteria.where("author").is("yinjihuan")); Article article = mongoTemplate.findAndRemove(query, Article.class); 复制代码
//查询出符合条件的全部结果,并将符合条件的全部数据删除 query = Query.query(Criteria.where("author").is("yinjihuan")); List<Article> articles = mongoTemplate.findAllAndRemove(query, Article.class); 复制代码
首先初始化须要修改的数据markdown
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 0, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 0, "add_time": ISODate("2016-08-29T13:46:22.201Z") } 复制代码
//修改第一条author为yinjihuan的数据中的title和visitCount Query query = Query.query(Criteria.where("author").is("yinjihuan")); Update update = Update.update("title", "MongoTemplate").set("visitCount", 10); mongoTemplate.updateFirst(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现第一条数据的title还有visit_count被修改了
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 0, "add_time": ISODate("2016-08-29T13:46:22.201Z") } 复制代码
//修改所有符合条件的 query = Query.query(Criteria.where("author").is("yinjihuan")); update = Update.update("title", "MongoTemplate").set("visitCount", 10); mongoTemplate.updateMulti(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现全部数据的title还有visit_count被修改了
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:22.201Z") } 复制代码
//特殊更新,更新author为jason的数据,若是没有author为jason的数据则以此条件建立一条新的数据 //当没有符合条件的文档,就以这个条件和更新文档为基础建立一个新的文档,若是找到匹配的文档就正常的更新。 query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").set("visitCount", 10); mongoTemplate.upsert(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现新增了一条数据
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:22.201Z") } { "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "visit_count": 10 } 复制代码
//更新条件不变,更新字段改为了一个咱们集合中不存在的,用set方法若是更新的key不存在则建立一个新的key query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").set("money", 100); mongoTemplate.updateMulti(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现新加了一个key
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "visit_count": 10, "money":100 } 复制代码
//update的inc方法用于作累加操做,将money在以前的基础上加上100 query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").inc("money", 100); mongoTemplate.updateMulti(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现money变成200
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "visit_count": 10, "money":200 } 复制代码
//update的rename方法用于修改key的名称 query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").rename("visitCount", "vc"); mongoTemplate.updateMulti(query, update, Article.class); 复制代码
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "vc": 10, "money":200 } 复制代码
//update的unset方法用于删除key query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").unset("vc"); mongoTemplate.updateMulti(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现vc这个key被删除了
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "money":200 } 复制代码
//update的pull方法用于删除tags数组中的java query = Query.query(Criteria.where("author").is("yinjihuan")); update = Update.update("title", "MongoTemplate").pull("tags", "java"); mongoTemplate.updateMulti(query, update, Article.class); 复制代码
修改后结果以下,咱们会发现tags里的java被删除了
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:22.201Z") } 复制代码
查询,不管是关系型数据库仍是mongodb这种nosql,都是使用比较多的,大部分操做都是读的操做。 mongodb的查询方式不少种,下面只列了一些经常使用的,好比: 1.=查询 2.模糊查询 3.大于小于范围查询 4.in查询 5.or查询 6.查询一条,查询所有 7.本身慢慢学习...
根据做者查询全部符合条件的数据,返回List
Query query = Query.query(Criteria.where("author").is("yinjihuan")); List<Article> articles = mongoTemplate.find(query, Article.class); 复制代码
只查询符合条件的第一条数据,返回Article对象
query = Query.query(Criteria.where("author").is("yinjihuan")); Article article = mongoTemplate.findOne(query, Article.class); 复制代码
查询集合中全部数据,不加条件
articles = mongoTemplate.findAll(Article.class);
复制代码
查询符合条件的数量
query = Query.query(Criteria.where("author").is("yinjihuan")); long count = mongoTemplate.count(query, Article.class); 复制代码
根据主键ID查询
article = mongoTemplate.findById(new ObjectId("57c6e1601e4735b2c306cdb7"), Article.class); 复制代码
in查询
List<String> authors = Arrays.asList("yinjihuan", "jason"); query = Query.query(Criteria.where("author").in(authors)); articles = mongoTemplate.find(query, Article.class); 复制代码
ne(!=)查询
query = Query.query(Criteria.where("author").ne("yinjihuan")); articles = mongoTemplate.find(query, Article.class); 复制代码
lt(<)查询访问量小于10的文章
query = Query.query(Criteria.where("visitCount").lt(10)); articles = mongoTemplate.find(query, Article.class); 复制代码
范围查询,大于5小于10
query = Query.query(Criteria.where("visitCount").gt(5).lt(10)); articles = mongoTemplate.find(query, Article.class); 复制代码
模糊查询,author中包含a的数据
query = Query.query(Criteria.where("author").regex("a")); articles = mongoTemplate.find(query, Article.class); 复制代码
数组查询,查询tags里数量为3的数据
query = Query.query(Criteria.where("tags").size(3)); articles = mongoTemplate.find(query, Article.class); 复制代码
or查询,查询author=jason的或者visitCount=0的数据
query = Query.query(Criteria.where("").orOperator( Criteria.where("author").is("jason"), Criteria.where("visitCount").is(0))); articles = mongoTemplate.find(query, Article.class); 复制代码
更多技术分享请关注微信公众号:猿天地