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很简单,只需要如下几步即可:
- 导入起步依赖
- 编写配置信息
- 编写实体类(配置注解 @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. }