当前位置: 首页 > news >正文

MongoDB基础【学习笔记】

一、数据库分类

  • 关系型数据库(RDBMS)
    • MySQL、Qracle、DB2、SQL Server …
    • 关系数据库中全部是表
  • 非关系型数据库(NoSQL Not Only SQL)
    • MongoDB、Redis …
    • 键值对数据库
    • 文档数据库MongoDB

二、MongoDB

1、简介

  • MongoDB 是为快速开发物联网 Web 应用而设计的数据库系统。
  • MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分。
  • MongoDB 的数据模型是面向文档的,所谓文档是一种类似 JSON 的结构。(BSON)

2、三个概念

  • 数据库(database)
    数据库是一个仓库,在仓库中可以存放集合
  • 集合(collection)
    集合类似数组,在集合中可以存放文档
  • 文档(document)
    文档数据库中最小的单位,我们存储和操作的内容都是文档

3、下载

  • 下载地址:https://www.mongodb.com/try/download/community

4、安装

  • 安装包默认安装

  • 配置环境变量

  • 在C盘创建文件夹 data;在 data 中创建文件夹 db;

  • 打开 cmd 命令行窗口,输入 mongod 启动 mongdb 服务器
    (如果是 32位 系统,则输入 mongod --storageEngine=mmapvl) 在其它数据库启动并且自定义端口:mongod --dbpath 数据库路径 --port 端口号(最大不要超过 65535)`

  • (MongoDB6.0 以后做出了重大改变,MongoDB 已经不再默认安装 shell 工具)

    • 下载 MongDB Shell :
      https://www.mongodb.com/try/download/shell
    • 配置环境变量
  • 再打开一个 cmd 窗口,输入 mongosh,出现 test>

  • (针对 MongoDB 6.0)以前的版本)将 MongoDB 设置为系统服务,可以自动在后台启动

    • 在 data 下创建 db 和 log 文件夹

    • 在 bin 所在目录下添加一个配置文件:mongod.cfg

    • 以管理员的身份打开命令行窗口,执行命令:
      sc.exe create MongoDB binPath= "\"C:\Program Files\{{ mongod 的 目录 }}\bin\mongod.exe\" --service --config=\"C:\Program Files\{{ mongod 的 目录 }}\mongod.cfg\"" DisplayName="MongoDB" start= "auto"

    • 启动 mongodb service

    • 如果启动失败,则在控制台输入 sc delete MongoDB 删除之前配置的服务,再重新开始配置

三、基本操作

1、基本概念

  • 数据库(database)
  • 集合(collection)
  • 文档(document)

在 MongoDB 中,数据库和集合都不需要手动创建。当创建文档时,如果文档所有的集合或数据库不存在会自动创建数据库和集合。

MongoDB 的文档的属性值也是一个文档,当一个文档的属性值是一个文件时,我们将这个文档叫做内嵌文档;
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以通过 . 的形式来匹配,此时属性名必须使用引号。

2、基本指令

  • show dbsshow databases:显示当前的所有数据库
  • use 数据库名:进入到指定的数据库中
  • db:表示的是当前所处的数据库
  • show collections:显示数据库中所有的集合

3、数据库的 CRUD(增删改查) 的操作

  • db.<collection>.insert(doc):向集合中插入一个或多个文档

    • 当向集合中插入文档时,如果没有指定 _id 属性,则数据库会自动为文档添加 _id。该属性作为文档的唯一标识
    • db.collection.insertOne():插入一个文档对象
    • dn.collection.insertMany():插入多个文档对象(参数必须是数组)
  • db.<collection>.find():查询当前集合中所有的文档,find() 可以接受一个对象作为条件参数

    • {}表示查询集合中所有文档
    • {属性: 值}查询属性是指定值的文档
    • find() 返回的是一个数组

    db.<collection>.findOne():用来查询集合中符合条件的第一个文档

    • findOne() 返回的是一个对象

    db.<collection>.find({}).count():查询所有结果的数量

    db.<collection>.find().limit(n):设置显示数据的上限

    db.<collection>.find().skip(n):跳过指定数量的数据

    • db.<collection>.find().skip((页码 - 1) * 每页显示的条数).limit(每页显示的条数)
    • MongoDB 会自动调整 skip 和 limit 的位置
  • db.<collection>.updateOne(查询条件, 新对象):修改

    • update() 默认情况下会使用新对象来替换旧的对象,如果要修改指定的属性,而不是替换则要使用”修改操作符“:
      • $set:可以用来修改文档中的指定属性
      • $unset:可以用来删除文档的指定属性
      • $push:用于向数组中添加一个新的元素
      • $addToSet:向数组中添加一个新元素,如果数组中已经存在该元素,则不会添加
    • 默认只会修改一个文档

    db.<collection>.updateMany():同时修改多个符合条件的文档

    db.<collection>.replaceOne():替换一个符合条件的文档

  • db.<collection>.remove()

    • remove() 可以根据条件删除文档,传递的条件方式与 find() 类似,删除所有符合条件的文档(默认情况下)。如果 remove() 第二个参数传递一个 true,则只会删除一个
    • 如果只传递一个空对象作为参数,则会删除集合中的所有文档(性能较差)

    db.<collection>.deleteOne()

    db.<collection>.deleteMany()

    db.<collection>.drop():删除集合

4、sort

查询文档时,默认情况时按照 _id 的值进行排列的(升序)

sort() 可以用来指定文档的排序的规则,sort() 需要传递一个对象来指定排序规则:1 -> 升序 // -1 -> 降序

limit、skip、sort 可以任意排序

5、投影

在查询时,可以在第二个参数位置来设置查询结果

四、文档间的关系

1、single to single

在 MongoDB 中可以通过内嵌文档的形式来体现出 single to single 的关系

2、one-to-many / many-to-one

同样可以通过内嵌文档来映射一对多的关系

3、many-to-many

利用各个集合之间的 _id 建立联系

五、Mongoose

1、简介

  • Mongoose 是一个可以通过 Node 操作 MongoDB 的模块
  • Mongoose 是一个对象文档模型(ODM)库

2、好处

  • 可以为文档创建一个模式结构(Schema)
  • 可以对模型中的对象/文档进行验证
  • 数据可以通过类型转换转换为对象模型
  • 可以使用中间件来应用业务逻辑挂钩
  • 比 Node 原生的 MongoDB 驱动更容易

3、新的对象

  • Schema(模式对象)
    定义约束了数据库中的文档结构
  • Model
    Model 对象作为集合中的所有文档的表示,相当于 MongoDB 数据库中的集合 collection
  • Document
    表示集合中的具体文档,相当于集合中的一个具体文档

4、使用 Mongoose

  1. 下载安装 Mongoose
    npm i mongoose --save
  2. 在项目中引入 mongoose
    const mongoose = require("mongoose");
  3. 连接 MongoDB 数据库
    mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名');
    如果端口号时默认端口号(27017)则可以省略
  4. 监听 MongoDB 数据库的连接状态
    通过监视 mongoose.connection 可以监听数据库的连接与断开
    mongoose.connection.once("open/close", function() {})
  5. 断开连接(一般不使用)
    mongoose.disconnect()

5、Schema 和 Model

  • 创建 Schema 对象

    const Schema = mongoose.Schema;
    const stuSchema = new Schema({name: String,age: Number,gender: {type: String,default: "female"},address: String
    });
    
  • 通过 Schema 创建 Model

    const StuModel = mongoose.model("student", stuSchema);
    StuModel.create({name: "白骨精",age: 16,gender: "female",address: "白骨洞"
    }).then(() => {console.log("插入成功!");
    })
    

6、Model 的方法

  • Model.create(doc(s)):用来创建一个文档并添加到数据库中

    • doc(s):可以是一个文档对象,也可以是一个文档对象的数组
  • Model.find(conditions, [projection], [options]);:查询所有条件的文档,返回一个数组

    Model.findById(id, [projection], [options]);:根据文档的 id 属性查询文档

    Model.findOne([conditions], [projection], [options]);:查询符合条件的第一个文档

    • conditions:查询的条件
    • projection 投影 需要获取到的字段
      • {name: 1, _id: 0}
      • “name -_id”
    • options:查询选项(skip、limit…)
  • Model.update(conditions, doc, [options]);

    Model.updateMany(conditions, doc, [options]);

    Model.updateOne(conditions, doc, [options]);

    Model.replaceOne(conditions, doc, [options]);

  • Model.deleteOne(conditions);

    Model.deleteMany(conditions);

  • Model.count(conditions);:统计文档的数量

7、document 的方法

  • Model#save([options])
  • document.updateOne(update, [options]):修改对象
  • document.deleteOne():删除对象
  • document.get(name):获取文档中的指定属性值
  • document.set():设置文档的指定属性值
  • document.id:获取文档的 _id 属性值
  • document.toJSON():转换为一个 JSON 对象
  • document.toObject():把 document 对象转换成一个 普通的 JSON 对象

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux文件或图片名称中文乱码解决【适用于centos、ubuntu等系统】
  • MATLAB中“varargin”的作用
  • TCL 实业 x TiDB丨从分销转向零售,如何考虑中台建设和数据库选型?
  • 《Techporters架构搭建》-Day04 基础架构
  • C基础项目(学生成绩管理系统)
  • 从根儿上学习spring 七 之run方法启动第四段(1)
  • 云计算实训21——mysql-8.0.33-linux-glibc安装及使用
  • 电脑本地如何安装MySQL服务
  • Git详细命令大全
  • 大模型检索增强生成RAG
  • 题解 - 树上游走(二)(上海月赛2024.7甲组T1)
  • Python(模块)
  • 微信小程序实现上传照片功能
  • C#加班统计次数
  • CSS:图片间空白间距问题的解决方案
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Angular数据绑定机制
  • Effective Java 笔记(一)
  • JavaScript类型识别
  • Laravel Mix运行时关于es2015报错解决方案
  • Otto开发初探——微服务依赖管理新利器
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 产品三维模型在线预览
  • 从setTimeout-setInterval看JS线程
  • 大数据与云计算学习:数据分析(二)
  • 大整数乘法-表格法
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 盘点那些不知名却常用的 Git 操作
  • 前端代码风格自动化系列(二)之Commitlint
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 微信小程序设置上一页数据
  • 想写好前端,先练好内功
  • 小程序01:wepy框架整合iview webapp UI
  • 转载:[译] 内容加速黑科技趣谈
  • 做一名精致的JavaScripter 01:JavaScript简介
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 数据结构
  • #565. 查找之大编号
  • #VERDI# 关于如何查看FSM状态机的方法
  • $().each和$.each的区别
  • (2)Java 简介
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (安卓)跳转应用市场APP详情页的方式
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (分类)KNN算法- 参数调优
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)菜鸟学数据库(三)——存储过程