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。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
yml配置文件
spring: data: mongodb: uri: mongodb://192.168.198.129:27017/baizhi #如果存在密码,使用下面这个(开启用户名密码校验) #host: 192.168.198.129:27017 # port: 27017 # database: baizhi # username: root # password: 123456 server: port: 7878
uri参数解释 : 协议://mongodb地址/库名
新建User实体类,此处采用Lombok简化开发
@Data @AllArgsConstructor @NoArgsConstructor @Document("users")//这个类的实例就代表mongo中一条文档 public class User { @Id//用这个类的id映射文档的_id private Integer id; @Field("username") private String name; @Field private Double salary; @Field private Date birthday; }
创建集合
//创建集合 @Test void contextLoads() { //判断这个集合在数据库中是否存在 boolean product = mongoTemplate.collectionExists("product"); if (!product) { //创建集合 mongoTemplate.createCollection("product"); } }
删除集合
//删除集合 @Test void testDropCollection(){ //集合不存在,删除也不会报错 mongoTemplate.dropCollection("product"); }
添加文档
//文档操作 添加 @Test void testadd(){ User user = new User(5, "王献之", 2100.1, new Date()); //save方法在主键存在时是更新操作 // mongoTemplate.save(user); //insert方法主键存在时,会报错,主键冲突 mongoTemplate.insert(user); }
添加文档二
//文档操作 批量增加 @Test void testinsertMany(){ List<User> users = Arrays.asList(new User(3, "干将莫邪3", 2300.1, new Date()), new User(4, "干将莫邪4", 2300.1, new Date())); mongoTemplate.insert(users,User.class);//参数一:批量数据的集合,参数二:这个集合的类型 }
查询所有文档
//文档操作 查询 @Test void testFind(){ //查询所有 List<User> all = mongoTemplate.findAll(User.class); all.forEach(System.out::println); }
主键查询
@Test void testFindById(){ User byId = mongoTemplate.findById(1, User.class); System.out.println("byId = " + byId); }
文档操作 所有复杂查询
//文档操作 条件查询 @Test void testFind2(){ //查询全部 参数一:查询条件 参数二:返回的类型 List<User> users = mongoTemplate.find(new Query(), User.class); users.forEach(System.out::println); //等值查询 Query query = Query.query(Criteria.where("name").is("干将莫邪")); List<User> users = mongoTemplate.find(query, User.class); users.forEach(System.out::println); // > < <= >= 查询 List<User> users = mongoTemplate.find(Query.query(Criteria.where("salary").gt(2600.1)), User.class); users.forEach(System.out::println); // and 查询 List<User> users = mongoTemplate.find(Query.query(Criteria.where("name").is("干将莫邪").and("salary").is(2500.1)), User.class); users.forEach(System.out::println); //or 查询 Criteria criteria = new Criteria(); criteria.orOperator( Criteria.where("name").is("干将莫邪"), Criteria.where("name").is("干将莫邪3") // Criteria.where("salary").lte(2600.1) ); List<User> users = mongoTemplate.find(Query.query(criteria), User.class); users.forEach(System.out::println); //and or 查询 List<User> users = mongoTemplate.find(Query.query(Criteria.where("salary").is(2600.1).orOperator(Criteria.where("name").is("干将莫邪2"))), User.class); users.forEach(System.out::println); //排序查询 Query querySort = new Query(); querySort.with(Sort.by(Sort.Order.asc("salary"))); List<User> users = mongoTemplate.find(querySort, User.class); users.forEach(System.out::println); //分页查询 Query querySort = new Query(); querySort.with(Sort.by(Sort.Order.asc("salary"))) .skip(1) .limit(2); List<User> users = mongoTemplate.find(querySort, User.class); users.forEach(System.out::println); } //查询总条数 long count = mongoTemplate.count(Query.query(Criteria.where("name").is("干将莫邪")), User.class); System.out.println("count = " + count); //去重查询 List<String> name = mongoTemplate.findDistinct(new Query(), "name", User.class, String.class); name.forEach(System.out::println); }
更新操作
//更新操作 @Test void testUpdate(){ //更新符合条件的第一条数据 // Update update = new Update(); // update.set("salary",4000.1); // mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("干将莫邪")), update,User.class); //多条更新 // mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("干将莫邪"),update,User.class); //插入更新 没有符合条件数据的时候插入数据 Update update = new Update(); update.setOnInsert("id",10); update.set("salary",4000.1); UpdateResult salary = mongoTemplate.upsert(Query.query(Criteria.where("salary").is(10000.1)), update, User.class); //获取修改的数据 salary.getModifiedCount(); //获取本次匹配的记录数 salary.getMatchedCount(); //如果没有匹配的数据,获取新增的ID salary.getUpsertedId(); }
删除操作
//删除操作 @Test void testDelete(){ //删除所有 // mongoTemplate.remove(new Query(), User.class); //条件删除 mongoTemplate.remove(Query.query(Criteria.where("name").is("干将莫邪3")),User.class); }