[SpringBoot][8][文档数据库MongoDB]
第 8 章 文档数据库MongoDB
对于那些需要缓存而且经常需要统计、分析和查询的数据,Redis
这样简单的NoSQL
显然就不是那么便捷了, 这时另外一个NoSQL
就派上用场了,它就是本章的主题MongoDB
。对于那些需要统计、按条件查询和分析的数
据,它提供了支持,它可以说是一个最接近于关系数据库的NoSQL
。
MongoDB
是由C++
语言编写的一种NoSQL
,是一个基于分布式文件存储的开源数据库系统。在负载高时可以添加更多的节点,以保证服务器性能,MongoDB
的目的是为Web
应用提供可扩展的高性能数据存储解决方案。MongoDB
将数据存储为一个文档,数据结构由键值(key-value
)对组成。这里的MongoDB
文档类似于JSON
数据集,所以很容易转化成为JavaPOJO
对象或者JavaScript
对象,这些字段值还可以包含其他文档、数组及文档数组。
8.1 配置MongoDB
SpringBoot
提供了MongoDB
的配置,其默认的可配置项如下所示
1 2 3 4 5 6 7
| spring.data.mongodb.host=192.168.11.131 #MongoDB服务器 spring.data.mongodb.username=spring #MongoDB服务器用户名 spring.data.mongodb.password=123456 #MongoDB服务器密码 spring.data.mongodb.port=27017 #MongoDB服务器端口 spring.data.mongodb.database=springboot #数据库名称 spring.data.mongodb.repository.type=auto #是否启用MongoDB关于JPA规范的编程 spring.data.mongodb.field-naming-strategy=xxx #使用字段名策略
|
8.2 使用MongoTemplate实例
spring-data-mongodb
主要是通过MongoTemplate
进行操作数据。SpringBoot
会根据配置自动生成MongoTemplate
对象来操作数据,下面举个例子来说明
首先创建POJO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.springboot.chapter8.pojo;
import java.io.Serializable; 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;
@Document public class User implements Serializable { private static final long serialVersionUID = -7895435231819517614L; @Id private Long id; @Field("user_name") private String userName = null;
private String note = null; @DBRef private List<Role> roles = null; }
|
- 这个文档被标记为
@Document
,这说明它将作为MongoDB
的文档存在。注解@id
则将对应的字段设置为主键。@Field
可以将属性userName
与MongoDB
中的user_name
属性对应起来。然后角色列表,如果只想保存其引用,可以使用@DBRef
进行标注
然后编写一个Service
来看看MongoTemplate
如何操作MongoDB
文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| @Service public class UserServiceImpl implements UserService {
@Autowired private MongoTemplate mongoTmpl = null;
@Override public User getUser(Long id) { return mongoTmpl.findById(id, User.class); }
@Override public List<User> findUser(String userName, String note, int skip, int limit) { Criteria criteria = Criteria.where("user_name").regex(userName).and("note").regex(note); Query query = Query.query(criteria).limit(limit).skip(skip); List<User> userList = mongoTmpl.find(query, User.class); return userList; }
@Override public void saveUser(User user) { mongoTmpl.save(user, "user"); }
@Override public DeleteResult deleteUser(Long id) { Criteria criteriaId = Criteria.where("id").is(id); Query queryId = Query.query(criteriaId); DeleteResult result = mongoTmpl.remove(queryId, User.class); return result; }
@Override public UpdateResult updateUser(Long id, String userName, String note) { Criteria criteriaId = Criteria.where("id").is(id); Query query = Query.query(criteriaId); Update update = Update.update("user_name", userName); update.set("note", note); UpdateResult result = mongoTmpl.updateFirst(query, update, User.class); return result; }
}
|
- 注意: 在
MongoDB
中的save
,若已存在id
相同的对象,那么更新其属性;如果是已经存在的对象,则它只是对对象进行更新