MongoDB的安装和常用操作
-
Docker安装MongDB
- 拉取镜像
docker pull mongo:latest
- 创建和启动容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
- 进入容器
docker exec -it mymongo /bin/bash
- 使用MongoDB客户端进行操作
mongo
-
MongDB中简单的概念
- 数据库:相当于MySQL中的数据库
- 集合:相当于MySQL中的表。MongDB中集合就是文档组
- 文档:相当于MySQL中的记录。MongDB中文档是一组键值
- MongDB中不支持表连接;含主键、索引。MongDB中的主键即_id这个键
-
MongDB数据库的常用操作
- 切换/创建数据库(数据库不存在则创建)
use 数据库名;
- 查询所有的数据库
show dbs;
- 删除当前使用数据库
db.dropDatabase();
- 查看当前使用的数据库
db.getName();
- 显示当前db状态
db.stats();
- 查看当前db的链接机器地址
db.getMongo();
- 创建一个集合
db.createCollection("集合名字");
- 得到指定名称的集合
db.getCollection("集合名字");
- 向集合中添加一个文档
db.集合名.save({xxx:xx});
- 在集合中查询符合条件的文档
db.集合名.find({条件}); # 不指定条件则表示查询集合中所有的文档 db.集合名.find();
- 排序
# 示例:对年龄升序 1 和 -1 来指定排序的方式,User是一个集合 db.User.find().sort({age:1})
等等
Spring集成MongoDB
- 前置项
- 导入MongoDB依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
- 添加配置信息:在配置文件中指定了mongdb数据库的位置和使用的具体数据库
spring.data.mongodb.uri=mongodb://120.55.87.98:27017/test
- 创建实体类:实体类中指定了位于数据库中的指定集合
@Data // 指定对应MongoDB数据库中的集合名称 @Document("User") public class User { @Id private String id; private String name; private Integer age; private String email; private String createDate; }
- 方式1:使用MongoTemplate访问Mongodb
@SpringBootTest
class MongdbDemoApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
// 往集合中添加文档(集合名称在实体类中已经指定)
public void createUser() {
User user = new User();
user.setAge(20);
user.setName("张三");
user.setEmail("[email protected]");
User insert = mongoTemplate.insert(user);
System.out.println(insert);
}
// 查询集合中所有的文档
@Test
public void findAll() {
List<User> userList = mongoTemplate.findAll(User.class);
System.out.println(userList);
}
// 根据id查询
@Test
public void getById() {
User user = mongoTemplate.findById("627734f3e5cd55d257ad5c5e", User.class);
System.out.println(user);
}
// 条件查询
@Test
public void conditionQuery() {
// 查询名字张三,年龄20的用户
Query query = new Query(Criteria.where("name").is("张三").and("age").is(20));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
// 模糊查询
@Test
public void likeQuery() {
// 查询名字包含n或者N的用户
String name = "n";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
// 分页查询
@Test
public void pageQuery() {
String name = "n";
// 查询第一页10条数据(页号从1开始)
int pageNo = 1;
int pageSize = 10;
//构造查询条件:名字包含n或者N的
Query query = new Query();
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
int totalCount = (int) mongoTemplate.count(query, User.class);
List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
Map<String, Object> pageMap = new HashMap<>();
pageMap.put("list", userList);
pageMap.put("totalCount",totalCount);
System.out.println(pageMap);
}
// 修改
@Test
public void update() {
User user = mongoTemplate.findById("62773d17e5cd55d257ad5c60", User.class);
user.setName("张大大");
user.setAge(25);
user.setEmail("[email protected]");
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("name", user.getName());
update.set("age", user.getAge());
update.set("email", user.getEmail());
UpdateResult result = mongoTemplate.upsert(query, update, User.class);
long count = result.getModifiedCount();
System.out.println(count);
}
// 删除
@Test
public void delete() {
Query query = new Query(Criteria.where("_id").is("6277340cb142813efba79eee"));
DeleteResult deleteResult = mongoTemplate.remove(query, User.class);
// 打印1表示成功删除一条文档
System.out.println(deleteResult.getDeletedCount());
}
}
- 方式2:使用MongoRepository访问Mongodb
- 自定义接口继承自MongoRepository,之后通过接口实现类的对象调用MongoRepository中的方法完成CURD
@SpringBootTest public class Test { @Autowired private UserRepository userRepository; @org.junit.jupiter.api.Test // 向集合中添加文档 public void create() { User user = new User(); user.setName("李四"); user.setAge(24); user.setEmail("[email protected]"); User save = userRepository.save(user); } // 查询集合中所有的文档 @org.junit.jupiter.api.Test public void findAllUser() { List<User> userList = userRepository.findAll(); System.out.println(userList); } // 根据id查询用户 @org.junit.jupiter.api.Test public void findById() { Optional<User> user = userRepository.findById("627866e9a7183c1b2ffaf1bb"); System.out.println(user.get()); } // 条件查询 @org.junit.jupiter.api.Test public void conditionQuery() { User probe = new User(); // 查询姓名为李四年龄为24的用户 probe.setName("李四"); probe.setAge(24); Example<User> example = Example.of(probe); List<User> userList = userRepository.findAll(example); System.out.println(userList); } // 模糊查询 @org.junit.jupiter.api.Test public void findUsersLikeName() { //创建匹配器,即如何使用查询条件 ExampleMatcher matcher = ExampleMatcher.matching() //构建对象 .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询 .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写 User user = new User(); user.setName("四"); Example<User> userExample = Example.of(user, matcher); List<User> userList = userRepository.findAll(userExample); System.out.println(userList); } // 分页查询 @org.junit.jupiter.api.Test public void pageQuery() { // 按照年龄升序 Sort sort = Sort.by(Sort.Direction.ASC, "age"); // 0为第一页,2条记录 Pageable pageable = PageRequest.of(0, 2, sort); Page<User> users = userRepository.findAll(pageable); System.out.println(users); } // 修改 @org.junit.jupiter.api.Test public void update() { // 查询出指定的文档 User user = userRepository.findById("627735cee5cd55d257ad5c5f").get(); user.setName("王五"); user.setEmail("666.com"); // 修改 User save = userRepository.save(user); System.out.println(save); } // 删除 @org.junit.jupiter.api.Test public void delete() { userRepository.deleteById("627866e9a7183c1b2ffaf1bb"); } }