MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
mongodb集群参考
*面向集合存储,易存储对象类型的数据。
*模式自由。
*支持动态查询。
*支持完全索引,包含内部对象。
*支持查询。
*支持复制和故障恢复。
*使用高效的二进制数据存储,包括大型对象(如视频等)。
*自动处理碎片,以支持云计算层次的扩展性。
*支持 Golang,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
*文件存储格式为BSON(一种JSON的扩展)。
*可通过网络访问。
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。 [2]
MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。
1. <dependency> 2. <groupId>org.springframework.boot</groupId> 3. <artifactId>spring-boot-starter-data-mongodb</artifactId> 4. </dependency>
yml配置文件
1. spring: 2. data: 3. mongodb: 4. uri: mongodb://192.168.198.129:27017/baizhi 5. 6. 7. #如果存在密码,使用下面这个(开启用户名密码校验) 8. 9. #host: 192.168.198.129:27017 10. # port: 27017 11. # database: baizhi 12. # username: root 13. # password: 123456 14. 15. server: 16. port: 7878
uri参数解释 : 协议://mongodb地址/库名
新建User实体类,此处采用Lombok简化开发
1. @Data 2. @AllArgsConstructor 3. @NoArgsConstructor 4. @Document("users")//这个类的实例就代表mongo中一条文档 5. public class User { 6. @Id//用这个类的id映射文档的_id 7. private Integer id; 8. @Field("username") 9. private String name; 10. @Field 11. private Double salary; 12. @Field 13. private Date birthday; 14. }
创建集合
1. //创建集合 2. @Test 3. void contextLoads() { 4. //判断这个集合在数据库中是否存在 5. boolean product = mongoTemplate.collectionExists("product"); 6. if (!product) { 7. //创建集合 8. mongoTemplate.createCollection("product"); 9. } 10. }
删除集合
1. //删除集合 2. @Test 3. void testDropCollection(){ 4. //集合不存在,删除也不会报错 5. mongoTemplate.dropCollection("product"); 6. }
添加文档
1. //文档操作 添加 2. @Test 3. void testadd(){ 4. User user = new User(5, "王献之", 2100.1, new Date()); 5. //save方法在主键存在时是更新操作 6. // mongoTemplate.save(user); 7. //insert方法主键存在时,会报错,主键冲突 8. mongoTemplate.insert(user); 9. }
添加文档二
1. //文档操作 批量增加 2. @Test 3. void testinsertMany(){ 4. List<User> users = Arrays.asList(new User(3, "干将莫邪3", 2300.1, new Date()), new User(4, "干将莫邪4", 2300.1, new Date())); 5. mongoTemplate.insert(users,User.class);//参数一:批量数据的集合,参数二:这个集合的类型 6. }
查询所有文档
1. //文档操作 查询 2. @Test 3. void testFind(){ 4. //查询所有 5. List<User> all = mongoTemplate.findAll(User.class); 6. all.forEach(System.out::println); 7. }
主键查询
1. @Test 2. void testFindById(){ 3. User byId = mongoTemplate.findById(1, User.class); 4. System.out.println("byId = " + byId); 5. }
文档操作 所有复杂查询
1. //文档操作 条件查询 2. @Test 3. void testFind2(){ 4. //查询全部 参数一:查询条件 参数二:返回的类型 5. List<User> users = mongoTemplate.find(new Query(), User.class); 6. users.forEach(System.out::println); 7. 8. //等值查询 9. Query query = Query.query(Criteria.where("name").is("干将莫邪")); 10. List<User> users = mongoTemplate.find(query, User.class); 11. users.forEach(System.out::println); 12. 13. // > < <= >= 查询 14. List<User> users = mongoTemplate.find(Query.query(Criteria.where("salary").gt(2600.1)), User.class); 15. users.forEach(System.out::println); 16. 17. // and 查询 18. List<User> users = mongoTemplate.find(Query.query(Criteria.where("name").is("干将莫邪").and("salary").is(2500.1)), User.class); 19. users.forEach(System.out::println); 20. 21. //or 查询 22. Criteria criteria = new Criteria(); 23. criteria.orOperator( 24. Criteria.where("name").is("干将莫邪"), 25. Criteria.where("name").is("干将莫邪3") 26. // Criteria.where("salary").lte(2600.1) 27. ); 28. List<User> users = mongoTemplate.find(Query.query(criteria), User.class); 29. users.forEach(System.out::println); 30. 31. //and or 查询 32. List<User> users = mongoTemplate.find(Query.query(Criteria.where("salary").is(2600.1).orOperator(Criteria.where("name").is("干将莫邪2"))), User.class); 33. users.forEach(System.out::println); 34. 35. //排序查询 36. Query querySort = new Query(); 37. querySort.with(Sort.by(Sort.Order.asc("salary"))); 38. List<User> users = mongoTemplate.find(querySort, User.class); 39. users.forEach(System.out::println); 40. 41. //分页查询 42. Query querySort = new Query(); 43. querySort.with(Sort.by(Sort.Order.asc("salary"))) 44. .skip(1) 45. .limit(2); 46. List<User> users = mongoTemplate.find(querySort, User.class); 47. users.forEach(System.out::println); 48. } 49. 50. //查询总条数 51. long count = mongoTemplate.count(Query.query(Criteria.where("name").is("干将莫邪")), User.class); 52. System.out.println("count = " + count); 53. 54. //去重查询 55. List<String> name = mongoTemplate.findDistinct(new Query(), "name", User.class, String.class); 56. name.forEach(System.out::println); 57. }
更新操作
1. //更新操作 2. @Test 3. void testUpdate(){ 4. //更新符合条件的第一条数据 5. // Update update = new Update(); 6. // update.set("salary",4000.1); 7. // mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("干将莫邪")), update,User.class); 8. 9. //多条更新 10. // mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("干将莫邪"),update,User.class); 11. 12. 13. 14. //插入更新 没有符合条件数据的时候插入数据 15. Update update = new Update(); 16. update.setOnInsert("id",10); 17. update.set("salary",4000.1); 18. UpdateResult salary = mongoTemplate.upsert(Query.query(Criteria.where("salary").is(10000.1)), update, User.class); 19. 20. //获取修改的数据 21. salary.getModifiedCount(); 22. //获取本次匹配的记录数 23. salary.getMatchedCount(); 24. //如果没有匹配的数据,获取新增的ID 25. salary.getUpsertedId(); 26. 27. }
删除操作
1. 2. //删除操作 3. @Test 4. void testDelete(){ 5. //删除所有 6. // mongoTemplate.remove(new Query(), User.class); 7. //条件删除 8. mongoTemplate.remove(Query.query(Criteria.where("name").is("干将莫邪3")),User.class); 9. }