zoukankan      html  css  js  c++  java
  • 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> {
    }
    • 最后一式两份的

     

  • 相关阅读:
    Centos6.5环境中安装vsftp服务
    MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】
    linux系统被入侵后处理经历【转】
    Linux lsof命令详解和使用示例【转】
    Oracle 表空间和用户权限管理【转】
    如何在 Linux 中找出最近或今天被修改的文件
    Linux 服务器系统监控脚本 Shell【转】
    1张图看懂RAID功能,6张图教会配置服务器【转】
    简析TCP的三次握手与四次分手【转】
    TCP协议中的三次握手和四次挥手(图解)【转】
  • 原文地址:https://www.cnblogs.com/msi-chen/p/11802505.html
Copyright © 2011-2022 走看看