• 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> {
    }
    • 最后一式两份的

     

  • 相关阅读:
    CSUFT 1002 Robot Navigation
    CSUFT 1003 All Your Base
    Uva 1599 最佳路径
    Uva 10129 单词
    欧拉回路
    Uva 10305 给任务排序
    uva 816 Abbott的复仇
    Uva 1103 古代象形文字
    Uva 10118 免费糖果
    Uva 725 除法
  • 原文地址:https://www.cnblogs.com/msi-chen/p/11802505.html
Copyright © 2020-2023  润新知