【探花交友】day03—MongoDB基础(二)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 【探花交友】day03—MongoDB基础(二)

2.4、删除数据

通过remove()方法进行删除数据,语法如下:

1. db.collection.remove(
2. <query>,
3.    {
4.      justOne: <boolean>,
5.      writeConcern: <document>
6.    }
7. )

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。

实例:

1. #删除数据
2. > db.user.remove({})
3. 
4. #插入4条测试数据
5. db.user.insert({id:1,username:'zhangsan',age:20})
6. db.user.insert({id:2,username:'lisi',age:21})
7. db.user.insert({id:3,username:'wangwu',age:22})
8. db.user.insert({id:4,username:'zhaoliu',age:22})
9. 
10. > db.user.remove({age:22},true)
11. 
12. #删除所有数据
13. > db.user.remove({})

2.5、查询数据

MongoDB 查询数据的语法格式如下:

db.user.find([query],[fields])

  • query :可选,使用查询操作符指定查询条件
  • fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

条件查询:

操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value>} db.col.find({"by":"黑马程序员"}).pretty() where by = '黑马程序员'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

实例:

1. #插入测试数据
2. db.user.insert({id:1,username:'zhangsan',age:20})
3. db.user.insert({id:2,username:'lisi',age:21})
4. db.user.insert({id:3,username:'wangwu',age:22})
5. db.user.insert({id:4,username:'zhaoliu',age:22})
6. 
7. db.user.find()  #查询全部数据
8. db.user.find({},{id:1,username:1})  #只查询id与username字段
9. db.user.find().count()  #查询数据条数
10. db.user.find({id:1}) #查询id为1的数据
11. db.user.find({age:{$lte:21}}) #查询小于等于21的数据
12. db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2
13. 
14. #分页查询:Skip()跳过几条,limit()查询条数
15. db.user.find().limit(2).skip(1)  #跳过1条数据,查询2条数据
16. db.user.find().sort({id:-1}) #按照id倒序排序,-1为倒序,1为正序

2.6、索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

1. #创建索引
2. > db.user.createIndex({'age':1})
3. 
4. #查看索引
5. > db.user.getIndexes()
6. [
7.  {
8.    "v" : 2,
9.    "key" : {
10.       "_id" : 1
11.     },
12.     "name" : "_id_",
13.     "ns" : "testdb.user"
14.   }
15. ]
16. #说明:1表示升序创建索引,-1表示降序创建索引。

2.7、执行计划

MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。

1. #插入1000条数据
2. for(var i=1;i<1000;i++)db.user.insert({id:100+i,username:'name_'+i,age:10+i})
3. 
4. #查看执行计划
5. > db.user.find({age:{$gt:100},id:{$lt:200}}).explain()
6. 
7. #测试没有使用索引
8. > db.user.find({username:'zhangsan'}).explain()
9. 
10. #winningPlan:最佳执行计划
11. #"stage" : "FETCH", #查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询

4、SpringData-Mongo

Spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作,封装了底层的mongodb-driver。

地址:Spring Data MongoDB

使用Spring-Data-MongoDB很简单,只需要如下几步即可:

  • 导入起步依赖
  • 编写配置信息
  • 编写实体类(配置注解 @Document,@Id)
  • 操作mongodb
  • 注入MongoTemplate对象,完成CRUD操作
  • 编写Repository接口,注入接口完成基本Crud操作

4.1、环境搭建

第一步,导入依赖:

1. <parent>
2. <groupId>org.springframework.boot</groupId>
3. <artifactId>spring-boot-starter-parent</artifactId>
4. <version>2.3.9.RELEASE</version>
5. </parent>
6. <dependencies>
7. <dependency>
8. <groupId>org.springframework.boot</groupId>
9. <artifactId>spring-boot-starter-data-mongodb</artifactId>
10. </dependency>
11. <dependency>
12. <groupId>org.springframework.boot</groupId>
13. <artifactId>spring-boot-starter-test</artifactId>
14. <scope>test</scope>
15. </dependency>
16. </dependencies>

第二步,编写application.yml配置文件

1. spring:
2.   data:
3.     mongodb:
4.       uri: mongodb://192.168.136.160:27017/test

第三步,编写启动类

1. package com.tanhua.mongo;
2. 
3. import org.springframework.boot.SpringApplication;
4. import org.springframework.boot.autoconfigure.SpringBootApplication;
5. 
6. @SpringBootApplication
7. public class MongoApplication {
8. 
9. public static void main(String[] args) {
10.         SpringApplication.run(MongoApplication.class, args);
11.     }
12. }

4.2、完成基本操作

第一步,编写实体类

1. package com.tanhua.mongo.domain;
2. 
3. import lombok.AllArgsConstructor;
4. import lombok.Data;
5. import lombok.NoArgsConstructor;
6. import org.bson.types.ObjectId;
7. import org.springframework.data.mongodb.core.mapping.Document;
8. 
9. @Data
10. @AllArgsConstructor
11. @NoArgsConstructor
12. @Document(value="person")
13. public class Person {
14. 
15. private ObjectId id;
16. private String name;
17. private int age;
18. private String address;
19. 
20. }

第二步,通过MongoTemplate完成CRUD操作

1. package cn.itcast.mongo.test;
2. 
3. import cn.itcast.mongo.MongoApplication;
4. import cn.itcast.mongo.domain.Person;
5. import org.bson.types.ObjectId;
6. import org.junit.Test;
7. import org.junit.runner.RunWith;
8. import org.springframework.beans.factory.annotation.Autowired;
9. import org.springframework.boot.test.context.SpringBootTest;
10. import org.springframework.data.mongodb.core.MongoTemplate;
11. import org.springframework.data.mongodb.core.query.Criteria;
12. import org.springframework.data.mongodb.core.query.Query;
13. import org.springframework.data.mongodb.core.query.Update;
14. import org.springframework.test.context.junit4.SpringRunner;
15. 
16. import java.util.List;
17. 
18. @RunWith(SpringRunner.class)
19. @SpringBootTest(classes = MongoApplication.class)
20. public class MongoTest {
21. 
22. /**
23.      * SpringData-mongodb操作
24.      *    1、配置实体类
25.      *    2、实体类上配置注解(配置集合和对象间的映射关系)
26.      *    3、注入MongoTemplate对象
27.      *    4、调用对象方法,完成数据库操作
28.      */
29. @Autowired
30. private MongoTemplate mongoTemplate;
31. 
32. //保存
33. @Test
34. public void testSave() {
35. for (int i = 0; i < 10; i++) {
36. Person person = new Person();
37.             person.setId(ObjectId.get()); //ObjectId.get():获取一个唯一主键字符串
38.             person.setName("张三"+i);
39.             person.setAddress("北京顺义"+i);
40.             person.setAge(18+i);
41.             mongoTemplate.save(person);
42.         }
43.     }
44. 
45. //查询-查询所有
46. @Test
47. public void testFindAll() {
48.         List<Person> list = mongoTemplate.findAll(Person.class);
49. for (Person person : list) {
50.             System.out.println(person);
51.         }
52.     }
53. 
54. @Test
55. public void testFind() {
56. //查询年龄小于20的所有人
57. Query query = new Query(Criteria.where("age").lt(20)); //查询条件对象
58. //查询
59.         List<Person> list = mongoTemplate.find(query, Person.class);
60. 
61. for (Person person : list) {
62.             System.out.println(person);
63.         }
64.     }
65. 
66. /**
67.      * 分页查询
68.      */
69. @Test
70. public void testPage() {
71. Criteria criteria = Criteria.where("age").lt(30);
72. //1、查询总数
73. Query queryCount = new Query(criteria);
74. long count = mongoTemplate.count(queryCount, Person.class);
75.         System.out.println(count);
76. //2、查询当前页的数据列表, 查询第二页,每页查询2条
77. Query queryLimit = new Query(criteria)
78.                 .limit(2)//设置每页查询条数
79.                 .skip(2) ; //开启查询的条数 (page-1)*size
80.         List<Person> list = mongoTemplate.find(queryLimit, Person.class);
81. for (Person person : list) {
82.             System.out.println(person);
83.         }
84.     }
85. 
86. 
87. /**
88.      * 更新:
89.      *    根据id,更新年龄
90.      */
91. @Test
92. public void testUpdate() {
93. //1、条件
94. Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));
95. //2、更新的数据
96. Update update = new Update();
97.         update.set("age", 20);
98.         mongoTemplate.updateFirst(query, update, Person.class);
99.     }
100. 
101. @Test
102. public void testRemove() {
103. Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));
104.         mongoTemplate.remove(query, Person.class);
105.     }
106. }
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL API MongoDB
【探花交友】day03—MongoDB基础(四)
【探花交友】day03—MongoDB基础(四)
77 0
|
存储 NoSQL Java
【探花交友】day03—MongoDB基础(五)
【探花交友】day03—MongoDB基础(五)
89 0
|
存储 SQL JSON
【探花交友】day03—MongoDB基础(三)
【探花交友】day03—MongoDB基础(三)
97 0
|
NoSQL Java API
【探花交友】day03—MongoDB基础(一)
【探花交友】day03—MongoDB基础
99 0
|
存储 SQL NoSQL
【探花交友】学习MongoDB快速入门上手
【探花交友】学习MongoDB快速入门上手
95 0
【探花交友】学习MongoDB快速入门上手
|
1月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
2月前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
2月前
|
NoSQL 关系型数据库 MongoDB
非关系型数据库-MongoDB技术(一)
非关系型数据库-MongoDB技术(一)
|
24天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
25天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
下一篇
无影云桌面