一、Mongodb简介
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新。与此同时,它也为开发人员 提供了传统数据库的功能:二级索引,完整的查询系统以及严格一致性等等。 MongoDB能够使企业更加具有敏捷性和可扩展性,各种规模的企业都可以通过使用MongoDB来创建新的应用,提高与客户之间的工作效率,加快产品上市时间,以及降低企业成本。
MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企业级的可靠性和操作灵活性。
简单来说,MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。
MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型,也因为他的存储格式也使得它所存储的数据在Nodejs程序应用中使用非常流畅。
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
MongoDB中的一条记录就是一个文档,是一个数据结构,由字段和值对组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
MongoDB的适合对大量或者无固定格式的数据进行存储,比如:日志、缓存等。对事物支持较弱,不适用复杂的多文档(多表)的级联查询。
二、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
三、配置
- 单服务器配置
# mongodb数据库连接
spring.data.mongodb.uri=mongodb://192.168.56.101:27017/brahma_blog
本地安装的mongodb,没有用户名和密码,有用户名和密码的格式是
spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test,其中name是用户名,pass是密码
- 多数据库本配置
配置多个数据库,则中间用","分割
spring.data.mongodb.uri=mongodb://192.168.1.1:20000,192.168.1.2:20000,192.168.252.12:20000/test
四、MongoTemplate
- 实体类
@Data
@Document(collection="user")
public class User {
@NotBlank
private String account;
/**
* 使用md5(username + original password + salt)加密存储
*/
@NotBlank
private String password;
/**
* 头像
*/
private String avatar;
private String email; // 邮箱
@NotBlank
private String nickname;
private String mobilePhoneNumber;
/**
* 加密密码时使用的种子
*/
private String salt;
/**
* 创建时间
*/
private LocalDate createDate;
/**
* 最后一次登录时间
*/
private LocalDate lastLogin;
/**
* 系统用户的状态
*/
private UserStatus status = UserStatus.normal;
/**
* 是否是管理员
*/
private Boolean admin = false;
/**
* 逻辑删除flag
*/
private Boolean deleted = Boolean.FALSE;
}
- 插入记录
@SpringBootTest
class BrahmaApiApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
void insert(){
User user=new User();
user.setAccount("admin");
user.setPassword("123456");
user.setAvatar("");
user.setCreateDate(LocalDate.now());
user.setEmail("marquis@qq.com");
user.setAdmin(true);
user.setNickname("管理员");
user.setDeleted(false);
mongoTemplate.insert(user);
}
}
- 查询记录
@Test
void select() {
List<User> list = mongoTemplate.findAll(User.class);
log.info(JSON.toJSONString(list));
}
- 更新数据
@Test
void update() {
// 注意:id 为_id
Query query = Query.query(Criteria.where("_id").is(1));
Update update = new Update();
User user=new User();
user.setAccount("test");
user.setPassword("000000");
update.set("account", user.getAccount());
update.set("password", user.getPassword());
// 有则更新,没有则新增
mongoTemplate.upsert(query, update, "user");
// mongoTemplate.updateFirst(query, update, "user");
}
- 删除记录
@Test
void delete(){
Query query = Query.query(Criteria.where("_id").is(1));
this.mongoTemplate.remove(query, "user");
}
五、MongoRepository接口
- 接口定义
/**
* 用户数据接口
*/
@Repository
public interface UserRepository extends MongoRepository<User, String> {
/**
* 分页查询
* @param account
* @param pageable
* @return
*/
Page<User> findByAccountLike(String account, Pageable pageable);
}
- 添加记录
@Autowired
private UserRepository userRepository;
@Test
void insert(){
User user = new User();
// 注意:id类型一定要与定义一致
user.setId("1");
user.setAccount("admin");
user.setPassword("123456");
user.setAvatar("");
user.setCreateDate(LocalDate.now());
user.setEmail("marquis@qq.com");
user.setAdmin(true);
user.setNickname("管理员");
user.setDeleted(false);
userRepository.save(user);
}
- 条件查询
// 根据ID查询
Optional<User> optionalUser = userRepository.findById("1");
log.info(JSON.toJSONString(optionalUser.get()));
// 根据账号查询
User user = new User();
// 精确匹配
user.setAccount("admin");
// 因为有默认值,这里一定要设置
user.setAdmin(true);
// 默认会忽略空值的字段
Example<User> example = Example.of(user);
Optional<User> optionalUser = userRepository.findOne(example);
log.info(JSON.toJSONString(optionalUser.get()));
- 匹配器查询
User user = new User();
// 精确匹配
user.setAccount("admin");
ExampleMatcher matcher = ExampleMatcher
.matching()
// 全部模糊查询,即%{test}%
.withMatcher("account", ExampleMatcher.GenericPropertyMatchers.contains())
// 忽略字段,即不管createDate是什么值都不加入查询条件
.withIgnorePaths("admin");
// 默认会忽略空值的字段
Example<User> example = Example.of(user, matcher);
Optional<User> optionalUser = userRepository.findOne(example);
log.info(JSON.toJSONString(optionalUser.get()));
- 更新记录
@Test
void update(){
User user = new User();
// 注意:id类型一定要与定义一致
user.setId("1");
user.setAccount("test");
user.setPassword("888888");
user.setCreateDate(LocalDate.now());
user.setEmail("marquis@qq.com");
user.setAdmin(true);
user.setNickname("管理员");
user.setDeleted(false);
userRepository.save(user);
}
- 删除记录
@Test
void delete(){
User user = new User();
// 注意:id类型一定要与定义一致
user.setId("1");
userRepository.delete(user);
}
- 分页查询
@Test
void page() {
PageRequest pageable = PageRequest.of(0, 2);
Page<User> page = userRepository.findAll(pageable);
log.info("总页数:{}",page.getTotalPages());
log.info("总记录数:{}",page.getTotalElements());
}