MongoDB入门

MongoDB总结

简单介绍

摘自百度百科大致如下

  • 分布式文件储存数据库

  • 支持的数据结构类似于Json的Bson格式

  • 最佳优点:查询语言非常强大,类似面向对象的查询语言

  • 支持索引等

  • 调侃:是非关系型数据库中功能最丰富、最像关系型数据库的

docker安装

从下载到安装到启动客户端一气呵成:

  • docker search mongo

  • docker pull mongo //下载镜像

  • docker create --name mongodb -p 27017:27017 -v /ninja_data/mongodb:/data/db mongo:latest //创建容器

  • docker start mongodb //启动容器

  • docker exec -it mongodb /bin/bash //进入容器

  • mongo //使用客户端连接mongodb

  • show dbs //查看其下的所有数据库

命令行CRUD

就不一一截图了,过一下了解一下就ok

  • 先把数据库的一些基本命令说明一下

    • show dbs //查看所有的数据库

    • use testdb // mongo中创建数据库通过use选中的方式自动创建数据库

    • show tables或者 show collections //都是查看当前选中数据库下的所有表

    • db.表名.drop() //删除表

    • db.dropDatabases() //删除当前选中的数据库

  • 增加数据

    • 修改数据

      • 修改这里得多记下几笔:

        •  数据修改以以下为模板,方便大家理解

        

  • 删除数据

  • 查询数据

    前面大家应该都看到了一个命令:db.user.find(),这是查询user表下所有数据

    大致格式为:db.user.find([query],[fields]) ,两个参数均为可选

    • 第一个参数:命中的条件,相当于mysql中的where

    • 第二个参数:命中数据后返回的数据字段,相当于mysql中的select *

    db.col.find().pretty() :prett()会将命中的数据格式化显示,有利于浏览

    写两个简单列子,简单阐明一下

      • 常见的运算表达式如:

        • lt :<

        • lte :<=

        • gt :>

        • gte:=>

        • ne :!=

  • 更多的查询语句

mongo索引

索引的作用就不再做多赘述,避免全变扫描带来的低效率的有效解决手段

  • db.user.getIndexes() :查看当前表的索引情况

  • db.user.createIndex({'id':1}) :为字段id 创建索引

  • db.user.dropIndex("id_1") :删除我们刚刚创建的索引,id_1由查看索引信息得到name信息

  • db.user.dropIndexes() :删除除了mongo自带的-id字段外的其他一切索引

  • db.user.createIndex({'age':1, 'id':-1}) :创建联合索引,1表示升序,-1反之

  • db.user.totalIndexSize() :查看缩影大小、单位、字节

mongo执行计划

  • 我们就拿这一条数据来做个测试

    • db.user.find({age:{$lte:25}, id:{$gte:2}}).explain()

    • 我们可以看到在执行计划下部分有个属性:winingPlan,这才是我们看的地方

      • 第一个属性 "stage":" "

        • COLLSCAN:全表扫描

        • IXSCAN:索引扫描

        • FETCH:根据索引去检索文档

        • SHARD_MERGE:合并分片结果

        • IDHACK:针对_id进行查询

SpringBoot整合API

  • SpringBoot对mongo做了整合,下面简单了解一下相关API

  • 这次我分别对两种方式都做了简单的CRUD

  • 第一种方式,也就是我们Spring Data的惯用方式,写接口继承对应接口,按照一定的命名方式自动生成sql,完成简单的单表CRUD

  • 第二中方式,我们引入 MongoTemplate,实现对mongo数据的操作

  • 项目依赖:pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description><properties>
        <java.version>1.8</java.version>
    </properties><dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies><build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build></project>
  • 项目配置文件:aplication.yml

server:
  port: 8080
​
spring:
  application:
    name: mongoDemo
  data:
    mongodb:
      uri: mongodb://192.168.0.150:27017
      database: testdb

项目实体类:Person

package com.example.demo.vo;
import lombok.*;
import org.springframework.data.annotation.Id;
​
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
​
    @Id
    private Integer id;
    private String name;
    private Integer age;
}

第一种方式:MongoTemplate

  • 代码写的很松散,只为测试用,不要介意

package com.example.demo.Dao;
​
import com.example.demo.vo.Person;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import java.util.List;
​
@Component
public class PersonDao {
​
    @Autowired
    private MongoTemplate mongoTemplate;
​
    //增加
    public void testInsert(Person person){
        mongoTemplate.save(person);
        System.out.println("保存数据成功");
    }
​
    //构建条件查询器根据条件查询
    public List<Person> testQueryListByName(String name){
        /*构建查询条件*/
        Query query = Query.query(Criteria.where("name").is(name));
       return mongoTemplate.find(query, Person.class);
    }
​
    //分页查询
    public List<Person> testQueryPersonListPage(Integer page,Integer size){
        Query query = new Query().limit(size).skip((page - 1) * size);
        return mongoTemplate.find(query, Person.class);
    }
​
    //修改
    public UpdateResult updateById(Person person){
        Query query = Query.query(Criteria.where("_id").is(person.getId()));
        Update update = Update.update("age",person.getAge());
        update.set("name", person.getName());
        return mongoTemplate.updateFirst(query, update,Person.class);
    }
​
    //删除
    public DeleteResult testDeleteById(Integer id){
        Query query = Query.query(Criteria.where("id").is(id));
        return mongoTemplate.remove(query, Person.class);
    }
​
}
  • 第二种方式:extends MongoRepository<Person,Integer>

package com.example.demo;
​
import com.example.demo.vo.Person;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Component;
​
@Component
public interface repository extends MongoRepository<Person,Integer> {
}
  • 最后一式两份的

 

原文地址:https://www.cnblogs.com/msi-chen/p/11802505.html