1、mongo是什么:
ongoDB是一种强大、灵活、追求性能、易扩展的数据库;是面向文档的数据库,不是关系型数据库,是NoSQL(not only SQL)的一种。
MongoDB的面向文档,就是将关系型数据库中的“行”的概念换成了更加灵活的”文档”,以文档为存储单位。
文档的值可以是数组、文档等复杂的数据模型,这使得MongoDB可以支持复杂的结构类型;
另外MongoDB也不需要预先定义文档的键值,这使得开发者增加或者删除属性变得异常方便。
2、MongoDB功能特点
索引
MangoDB支持通用辅助索引、复合索引、地理空间索引和全文索引,能进行多种快速查询。
聚合
MangoDB支持MapReduce、aggregation pipeline等聚合
特殊集合
MongoDB提供TTL集合(超时集合)和固定大小的集合(适用于日志)
文件存储
MangeDB支持简单的文件存储。
不具备的功能
事务
3、能解决的问题:
数据量较大的情况下,关系型数据库的查询效率以及索引优化方案较为困难,可以引入mongo来实现查询效率问题
4、怎么用(落地实现)
mongo创建索引:db.test.test_db_cl.ensureIndex({“name”:1})
格式为db.库名.表明.ensureIndex(“字段”:1)
创建的复合索引格式如下:
db.库名.表明.ensureIndex(“字段1”:1,”字段2”:1)
除了让mongodb默认索引的名字外,我们还可以去一个方便记的名字,方法就是为ensureIndex指定name的值,如:
db.user.ensureIndex({“name”:1},{“name”:”IX_name”})
如果索引没有用了,可以使用dropIndexes将其删掉:
db.runCommand({“dropIndexes”:”user”,”index”:”IX_name”})
java实现步骤(约定>配置>编码)
(1)、约定引入pom

org.springframework.boot
spring-boot-starter-data-mongodb

(2)、配置

  1. spring:
  2. data:
  3. mongodb:
  4. uri: mongodb://服务器IP:端口/数据库名称
  5. # 上方未明确指定某个数据库的用户进行连接
  1. spring:
  2. data:
  3. mongodb:
  4. uri: mongodb://用户名:密码@服务器IP:端口/数据库名称
  5. # 上方为明确指定某个数据库的用户进行连接
  6. # 也可以使用admin 数据库中的用户进行连接统一到admin 数据库进行认证
  7. # admin 用户认证 url写法:mongodb://账户:密码%40@IP:端口/数据库名?authSource=admin&authMechanism=SCRAM-SHA-1

mongodb数据库与mysql不一样 mysql 一个普通用户可以管理多个数据库,但是mongo每一个库都有一个独立的管理用户,连接时需要输入对应用户密码
MongoDB监听配置
此类若不加,那么插入的一行会默认添加一个_class字段来存储实体类类型 如(com.example.demo.entity.Student)

  1. @Configuration
  2. public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {
  3. @Autowired
  4. MongoTemplate oneMongoTemplate;
  5. private static final String TYPEKEY = "_class";
  6. @Override
  7. public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
  8. MongoConverter converter = oneMongoTemplate.getConverter();
  9. if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
  10. ((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
  11. }
  12. }
  13. }

pojo实体类,service,controller编写
  1. @Data
  2. @Document(collection = "student") //指定要对应的文档名(表名)
  3. public class Student {
  4. /*** 自定义mongo主键 加此注解可自定义主键类型以及自定义自增规则
  5. * 若不加 插入数据数会默认生成 ObjectId 类型的_id 字段
  6. * org.springframework.data.annotation.Id 包下
  7. * mongo库主键字段还是为_id 。不必细究(本文实体类中为id)
  8. */
  9. @Id
  10. private Long id;
  11. private String username;
  12. private LocalDateTime timer;
  13. }

MongoTemplate 操作mongo库

(一)新增
声明接口

  1. int insertStudent(Student student);

实现类

  1. @Override
  2. public int insertStudent(Student student) {
  3. try {
  4. student.setTimer(LocalDateTime.now());
  5. mongoTemplate.insert(student);
  6. return 1;
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. return -1;
  10. }
  11. }

(二)修改
此处根据Id修改 ,如需其他条件 修改Query 查询条件即可
声明接口

  1. int updateStudent(Student student);

实现类
需注意 Query 以及update 在org.springframework.data.mongodb.core.query 包下

  1. @Override
  2. public int updateStudent(Student student) {
  3. //通过query根据id查询出对应对象,通过update对象进行修改
  4. Query query = new Query(Criteria.where("_id").is(student.getId()));
  5. Update update = new Update().set("username", student.getUsername());
  6. try {
  7. mongoTemplate.updateFirst(query, update, Student.class);
  8. return 1;
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. return -1;
  12. }
  13. }

(三)删除
此处根据id删除,如需其他删除条件,修改对应Query对象即可
声明接口

  1. int removeStudent(Long id);

实现类

  1. @Override
  2. public int removeStudent(Long id) {
  3. Query query=new Query(Criteria.where("_id").is(id));
  4. try {
  5. mongoTemplate.remove(query,Student.class);
  6. return 1;
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. return -1;
  10. }
  11. }

(四)、查询
声明接口

  1. Student findOne(Student student);

实现类

  1. @Override
  2. public Student findOne(Student student) {
  3. Query query = new Query(Criteria.where("_id").is(student.getId()));
  4. Student one = mongoTemplate.findOne(query, Student.class);
  5. return one;
  6. }

查询集合

  1. @GetMapping("/testA")
  2. public List<MongoTestDTO> testA(){
  3. Criteria criteria1 = Criteria.where("id").is(1L);
  4. Criteria criteria2 = Criteria.where("age").is(11);
  5. Criteria criteria3 = Criteria.where("name").is("张三");
  6. List<Criteria> list = new ArrayList<>();
  7. list.add(criteria1);
  8. list.add(criteria2);
  9. list.add(criteria3);
  10. Criteria criteria = new Criteria().andOperator(list);
  11. Query query = new Query(criteria);
  12. query.with(Sort.by(Sort.Order.asc("name")));
  13. query.skip((1-1)*10).limit(10);
  14. return mongoTemplate.find(query, MongoTestDTO.class);
  15. }