MongoDB基础入门学习

发布时间 2023-11-13 10:51:46作者: 六月生

MongoDB基础入门

此视频为学习 尚硅谷MongoDB基础入门的学习记录

导航

一、数据库

  1. 什么是数据库?

    • 存储数据的仓库
  2. 为什么要有数据库?

    • 首先数据是存储在内存里运行的,如果一断电的话,数据就会丢失,所以可以将数据存储到硬盘,但是硬盘没有联网,所以有了可以联网也可以存储数据的数据库。
  3. 数据库能做什么?

    • 数据库可以存储数据,并且这些数据还可以连接网络,也就是和硬盘相比,可以不用将数据库到处带,就像是网盘。
  4. 数据库的服务器和客户端

    • 服务器:保存数据的
    • 客户端:操作和存储数据的(CRUD)
  5. 数据库的分类

    • 按照关系型分类:

      • 关系型数据库(MySQL、Orcal等)

      • 非关系型数据库(MongoDB)

        • 关系型和非关系型的区别:
          总而言之就是:关系型的是创建表格, 非关系型是可以创建任意多个文档。

        • 1、数据存储方式不同。
          关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
          
          与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
          
          2、扩展方式不同。
          
          SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
          要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。
          
          因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。
          
          而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
          
          3、对事务性的支持不同。
          
          如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
          
          

二、MongoDB常见命令

  1. 安装MongoDB

  2. MongoDB的常见命令

    • 打开服务器:net start MongoDB
    • 关闭服务器:net stop MongoDB
    • 打开客户端:mongo,在cmd窗口便可以连接上数据库
  3. MongoDB的数据库分类

    • 数据库(database):用来存储集合的,而且数据库也有分大小。
    • 集合(collection):集合类似于数组,用于存放文档的
    • 文档(document): 文档是MongoDB数据库中最小的单位,我们要操作的目标就是文档。
    • MongoDB关系: 数据库(database) > 集合(collection)> 文档(document)
    • 值得注意的是: 在MongoDB中不需要自己创建数据库和集合,便可以直接创建文档,其实就是在创建文档的同时,会将数据库和集合创建了。
  4. 操作MongoDB数据库

    • 在使用之前可以安装一个编辑器(nosql manager for mongodb),下载免费版便可,可以不用在cmd界面操作。

    • 最基础的代码:

      • use ppxia:进入数据库ppxia
      • show dbs:显示数据库
      • show collections:显示当前数据库有什么集合
      • db:查看是在哪个数据库
    • 对MongoDB数据库的CRUD操作

      • 官方文档

      • 增加

        • db.集合名.insert(document):表示增加一个或多个文档

          db.piyou.insert({name: "孙悟空", age: 28, address:"花果山"});
          /*
          	表示向 集合名为piyou插入了文档, 文档内容是对象。
          	集合名是自己创建的,想用什么名称就用什么。
          */
          
          db.piyou.insert([
          	{name:"猪八戒", age: 38, address:"高老庄"}, 
          	{name: "沙和尚", age: 45, address:"流沙河"}
          ]);
          /*
          	可以注意到: 传递的数据是数组,数组内部是对象,
          		其实对象就相当于文档,这就是插入了两个文档。
          */
          
        • db.集合名.insertOne(document.[callback]):表示插入一个文档,回调函数callback是可选的

          • db.piyou.insertOne({name:"唐僧", age: 18, address: "女儿国"});
            /*
            	表示向集合名为piyou的 插入了一个文档。
            */
            
        • db.集合名.insertMany(document, [callback]):表示插入多个文档

          • db.piyou.insertMany([
            	{name:"白骨精", age:20,address:"白骨洞"}, 
            	{name:"蜘蛛精", age: 24, address:"蜘蛛洞"}
            ]);
            /*
            	可以看到,用法是和insert是相差不多的。数组里面有对象,对象即是文档。
            */
            
            
      • 查找

        • db.集合名.find(condition);:查询一个或多个文档

        • db.集合名。findOne(condition);:查询一个文档

        • db.集合名.findMany(condition):查询多个文档

        • 查询案例:

          • db.piyou.find({});

            {
                "_id" : ObjectId("654e3d779da167acf1219f50"),
                "name" : "孙悟空",
                "age" : NumberInt(28),
                "address" : "花果山"
            }
            {
                "_id" : ObjectId("654e3e0c9da167acf1219f51"),
                "name" : "猪八戒",
                "age" : NumberInt(38),
                "address" : "高老庄"
            }
            {
                "_id" : ObjectId("654e3e0c9da167acf1219f52"),
                "name" : "沙和尚",
                "age" : NumberInt(45),
                "address" : "流沙河"
            }
            {
                "_id" : ObjectId("654e3e529da167acf1219f53"),
                "name" : "唐僧",
                "age" : NumberInt(18),
                "address" : "女儿国"
            }
            {
                "_id" : ObjectId("654e3e829da167acf1219f54"),
                "name" : "白骨精",
                "age" : NumberInt(20),
                "address" : "白骨洞"
            }
            {
                "_id" : ObjectId("654e3e829da167acf1219f55"),
                "name" : "蜘蛛精",
                "age" : NumberInt(24),
                "address" : "蜘蛛洞"
            }
            
          • db.piyou.find({age:18})
            //这条语句表示的是查询age是18的文档。 值得注意的是,条件也是写在了对象里面,
            //也是因为传入的值需要是json语句	
            

            image-20231113103916560

        • db.集合名.find(condition).count;:使用count()来计数

          • db.piyou.find().count(); // 执行结果是: 6, 因为在插入那边是一共插入了6条数据
          • 总结:find()返回的是数组,数组内存放着文档,findOne()返回的就是一个文档,
            findMany()返回的也是数组内存放着文档的形式。find()的返回值还可以调用count(),
            用来获取符合条件的数量