• MongoDB基础学习


    一、数据库

    1. 概念介绍

    数据库是按照数据结构来组织、存储和管理数据的仓库。我们的程序在内存中运行,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失所以我们需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。说白了数据库就是存储数据的仓库。

    2. 数据库分类

    数据库主要分成两种:

    • 关系型数据库(RDBMS):MySQL、Oracle、DB2、SQL Server…(关系型数据库中全是表)
    • 非关系型数据库(No SQL):MongoDB(文档数据库)、Redis(键值对数据库)…

    二、MongoDB入门

    1. 简介

    MongoDB是为快速开发互联网Web应用而设计的数据库系统。MongoDB设计目标是及简、灵活、作为Web应用栈的一部分,它的数据模型是面向文档的,所谓文档是一种类似JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(BSON)。

    MongoDB数据库分为两个部分,分别是数据库服务器,它是用来保存数据的;另一部分是数据库客户端,数据库客户端用来操作服务器,对数据进行增删改查。

    MongoDB的安装和图形化界面安装就在这里不演示了,网上相关资源比较多

    MongoDB有三个基本概念:

    • 数据库:数据库是一个仓库,在仓库中可以存放集合
    • 集合:集合就是一组文档,也就是集合是用来存放文档的,集合中存储的文档可以是各种各样的,没有格式要求
    • 文档:文档数据库中的最小单位,我们存储和操作的内容都是文档

    多个文档组成集合,多个集合组成数据库

    在这里插入图片描述

    2. MongoDB的基本操作

    • 首先用客户端打开并连接到MongoDB

    在这里插入图片描述

    • 查看当前服务器有多少数据库
    show dbs
    
    • 1

    在这里插入图片描述

    可以看到当前有三个数据库,分别为admin、config、local

    • 进入并使用指定数据库
    use test #test是数据库名
    
    • 1

    在mongoDB中数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建,具体的创建时间时我们第一次向数据库中插入文档的时候创建。

    db
    
    • 1

    db命令可以查看当前我们的数据库名

    show collections
    
    • 1

    查看当前数据库中所有集合

    在这里插入图片描述

    • 数据库的CRUD的操作

    向数据库中插入数据

    #插入多条数据
    db.stus.insert([{name:"wohao",age:18,gender:"男"},{name:"nihao",age:23,gender:"男"}]);
    
    • 1
    • 2

    在这里插入图片描述

    #查询插入的数据
    db.stus.find();
    
    • 1
    • 2

    在这里插入图片描述

    发现相比我们添加的字段,数据库中的字段多了一个_id字段,这是因为,当我们向集合中插入文档的时候,如果没有给文档指定_id属性,则数据库会自动为文档添加一个_id,作为该文档的唯一标识(根据时间戳生成,有点和雪花算法类似)

    我们可以自己生成ID

    ObjectId()
    
    • 1

    在这里插入图片描述
    当然我们可以自己指定,但要自己确保唯一性

    db.stus.insert({_id:"hello",name:"wohao",age:18,gender:"男"});
    
    • 1

    insertOne():插入一个文档
    insertMany():插入多个文档

    上面两个方法是3.2后新加的

    向数据库中查询数据

    #查询stus集合中的所有文档
    db.stus.find();
    
    • 1
    • 2

    在这里插入图片描述

    find()的作用是查询集合中所有符合条件的文档,如果不提供条件默认就是查询所有文档,find()可以接受一个对象作为查询条件

    #查询姓名为"wohao"的文档
    db.stus.find({name:"wohao"})
    
    • 1
    • 2

    在这里插入图片描述

    上面查询的语法为find({属性名:属性值,属性名:属性值})

    db.stus.findOne({name:"wohao"})
    
    • 1

    在这里插入图片描述

    findOne({....})用来查询集合中符合条件的第一个文档

    上面同样可以用下面代码实现,因为find()本质上返回的是一个数组,而findOne返回的是一个对象

    修改数据库中的数据

    db.stus.update({ name: "wohao" }, { $set: {age: 100} });
    
    • 1

    update(查询条件,新对象),update默认情况下会使用新对象来替换旧对象

    在这里插入图片描述

    只修改了第一条数据,其中$set是原子操作符,表示修改,update()默认情况下只会修改一个数据

    db.stus.update({ name: "wohao" }, { $unset: {age: 100} });
    
    • 1

    在这里插入图片描述

    unset表示删除一个指定的属性

    #同时修改多个符合条件的文档
    db.stus.updateMany({name:"wohao"},{ $set: {name:"张飞"}})   ;
    #同时修改一个符合条件的文档
    db.stus.updateOne():
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    实际上update()函数也是可以修改多个的,只要设置参数即可
    在这里插入图片描述

    
    db.stus.update({ name: "nihao" }, { $set: {name: "关羽"} },{multi:true});
    
    • 1
    • 2

    在这里插入图片描述

    #用于替换一个文档
    db.stus.replaceOne();
    
    • 1
    • 2

    删除数据库中的数据

    首先记录一下原先数据库中的数据
    在这里插入图片描述

    #删除name为jack的文档
    db.stus.remove({name="jack"});
    
    • 1
    • 2

    在这里插入图片描述

    remove()可以根据条件来删除文档,传递的条件的方式和find()一样,remove是可以删除所有匹配的文档的,指定参数可以只删一个

    在这里插入图片描述

    #删除一个匹配到的文档
    db.stus.remove({name="jack"},true);
    #删除全部文档,这种清空集合的方式效率比较低,因为它要一条一条的删除集合中的数据
    db.stus.remove({});
    #删除stus集合
    db.stus.drop()
    #删除数据库
    db.dropDatabase();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    一般数据库中的数据都不会删除,所以删除的方法很少调用,在实际开发过程中我们会在表中添加一个字段,来实现逻辑删除,如下图isDelete就表示数据是否被删除。,

    3. MongoDB文档间的关系

    MongoDB文档间的关系主要分为三种:

    • 一对一

    例如夫妻关系是一对一,在MongoDB中可以通过内嵌文档的形式来显示一对一的关系

    #文档中间嵌入文档
    db.wifeAndhusband.insert({
        name:"xiaomei",
        hunsband:{
            name:"xiaoshuai"
            }
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    • 一对多/多对一

    这种情况是最多的,例如用户和订单就是一种典型的一对多的关系,在MongoDB中这种关系的体现形式如下

    #创建user集合
     db.users.insert([{_id:1,name:"java"},{_id:2,name:"python"}]);
     
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #创建订单集合
    db.Orders.insert([{
             list: ["pg","xj","yl"],
             user_id: 1
         },
         {
             list: ["pg","xj","yl"],
             user_id: 2
         }
     ]);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    #查询java的订单
       
      var user_id=db.users.findOne({name:"java"})._id;
      db.Orders.find({user_id:user_id});
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    • 多对多

    例如老师和学生的关系就是多对多的关系

    首先创建老师

      
      db.teacher.insert([
              {name:"th"},
              {name:"tw"},
              {name:"tl"}
      ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后创建学生

      db.student.insert([
          {name:"xiaoli",teach_id:[ObjectId("65deb10745c350d729213802"),ObjectId("65deb10745c350d729213803"),ObjectId("65deb10745c350d729213804")]}
      ])
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4. Sort和投影

    db.score.insert([
        {name:"xiaoming",score:78},
        {name:"xiaozhang",score:89},
        {name:"xiaoshuai",score:67},
        {name:"xiaohua",score:13},
        {name:"xiaoliu",scoer:99}
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    find();函数查询数据的时候默认按照_id去排序,本质上就是按照时间排序

    在这里插入图片描述

    MongoDB中sort函数可以指定文档排序的功能。

    #按照score升序排序
    db.score.find().sort({score:1});
    #按照score降序排序
    db.score.find().sort({score:-1});
    #先按照socer1先降序排序,再按照score升序排序
    db.score.find().sort({score1:-1,score:1});
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    如果我们在查询文档的时候只想看到我们想看到的字段,这时候就可以使用投影技术。

    #只看name不看_id字段
    db.score.find({},{name:1,_id:0}).sort({score:1});
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    GameFi 代币的单币与双币模型比较
    软硬件协同仿真 l 原理及主要组成部分概述
    浅谈接口自动化测试
    代码随想录算法训练营Day36 || leetCode 435. 无重叠区间 || 763.划分字母区间 || 56. 合并区间
    牛客网Day1
    GAMES101:作业2记录
    全面解析C语言多媒体开源框架GStreamer
    3k+星星的eat_pytorch_in_20_days更新啦
    归并排序-面试例子
    scanf(“%s“, filename);这里的scanf函数中,“,”逗号符号后面什么时候需要用“&”这个符号,什么时候不需要用这个“&”符号?
  • 原文地址:https://blog.csdn.net/qq_43456605/article/details/136318923