• Mongodb基础(node.js版)


    一、Mongodb 介绍

    Mongodb 是一个文档数据库,以文档形式存储数据,格式类似于 JSON

    Mysql 的特点及选型对照

    MongodbMysql
    关系类型非关系型关系型
    存储类型文档存储(类似于写 Word )表格存储 (类似于写 Excle)
    操作类型NoSQL 操作 (不需要写 sql 语句)SQL 操作
    选型对照适合存储格式比较松散的信息,如“爬虫”下来的数据适合存储格式比较规整的信息

    说明:并不是说在真实项目中,两种数据库只能选其一, 二者是可以同时使用的。对于用户信息表等规整信息可以采用 Mysql 数据库存储,而对于网页中类似博客内容等大段的富文本信息(同时包含文本、视频、图片等),放到 Mysql 数据库中的一个字段中存储就不太合适了。

    二、Mongodb 及 Compass 安装

    网上安装的资料很多,这里就不在重复了,大家可以根据以下参考博客进行安装

    Mongodb 安装

    Window 平台安装链接icon-default.png?t=N7T8https://link.juejin.cn?target=https%3A%2F%2Fwww.runoob.com%2Fmongodb%2Fmongodb-window-install.html

    Mac OS 平台安装链接 (推荐使用 brew 进行安装)icon-default.png?t=N7T8https://link.juejin.cn?target=https%3A%2F%2Fwww.runoob.com%2Fmongodb%2Fmongodb-osx-install.html

    安装后默认的运行了 Mongodb 服务器,以及连接上了 Mongodb, 可以直接通过命令行进行操作了。如果你还连接不上 Mongodb ,请参考上面安装连接中的配置。

    Mongodb Compass 安装

    Mongodb Compass 是官方推荐的一款可视化工具,可以方便直观的进行数据的浏览和操纵

    安装链接icon-default.png?t=N7T8https://link.juejin.cn?target=https%3A%2F%2Fwww.jianshu.com%2Fp%2Fca1e722b6788

    三、重要概念

    1、和 Mysql 的差异

    对于关系型数据库,使用时通常是先创建数据库,再创建表,然后对记录的增删改查

    但在 Mongodb 中这些名词上有些差异,操作步骤如下:

    • 创建一个数据库 (database) -- 和 Mysql 相同
    • 创建集合 (collection) -- 对应 Mysql 中的表
    • 对文档 (document) 的增删改查 -- 对应 Mysql 中记录的增删改查

    2、BSON

    • Mongodb 的文档使用的格式是 BSON
    • BSON = Binary JSON ,是二进制类型的 JSON

    四、使用 Compass 操作 Mongodb

    1、打开后的界面如图所示,点击 “CONNECT” 进行连接

    2、新安装的 Mongodb 默认带了三个数据库; 点击 “CREATE DATABASE” 进行创建数据库 

     

    3、创建数据库和集合 

     

    4、点击 “ADD DATA” 可以增加文档 

     

    5、文档的格式如下图 : 

     

    6、对文档的查找、修改和删除 

     

    注:查找时输入的数据也是类似于 JSON 的格式

    五、使用命令行操作 Mongodb

    打开 Mongodb 目录下 bin/mongo.exe

    注:dbName、collName 等 请改为自己创建的数据库或集合的名字

    1、查看操作

    1. # 查看有哪些数据库
    2. show dbs
    3. # 创建或进入数据库 (当数据库不存在即创建)
    4. use dbName
    5. # 查看有哪些集合
    6. show collections

    2、创建集合 / 向集合中插入文档

    1. # 可以直接向集合插入数据,对不存在的集合将会创建
    2. db.collName.insert({"name":"Axton", "age":20})

    3、显示集合中的文档

    1. # 显示集合中全部文档
    2. db.collName.find()
    3. # 显示集合中特定文档
    4. db.collName.find({ "name":"Axton" })
    5. # 排序,按 ID 倒序排序
    6. db.collName.find().sort({_id:-1})

    4、更新文档

    db.collName.update({"name":"Axton", $set:{"name": "Axton2"}})

    5、删除文档

    db.collName.update({"name":"Axton", $set:{"name": "Axton2"}})

     

    六、Node.js 中使用 mongodb 插件连接数据库

    1、初始化环境

    1. # 初始化 node.js 环境
    2. npm init -y
    3. # 安装 mongodb 模块
    4. npm i mongodb --save

     2、连接到 Mongodb

    1. const MongoClient = require('mongodb').MongoClient
    2. const url = 'mongodb://localhost:27017' // 默认端口号为 27017 ,如修改过请自行更改
    3. const dbName = 'mydb' // 需要连接的数据库名字
    4. MongoClient.connect(
    5. url,
    6. {
    7. // 配置 (默认写上就好)
    8. useUnifiedTopology: true
    9. },
    10. (err, client) => {
    11. if (err) {
    12. console.error('mongodn connect error', err)
    13. return
    14. }
    15. console.log('mongodb connect success')
    16. // 切换到数据库
    17. const db = client.db(dbName)
    18. // 关闭连接
    19. client.close()
    20. }
    21. )

    3、文档(Document)的操作

    查询文档
    1. const MongoClient = require('mongodb').MongoClient
    2. const url = 'mongodb://localhost:27017'
    3. const dbName = 'mydb'
    4. MongoClient.connect(
    5. url,
    6. {
    7. useUnifiedTopology: true
    8. },
    9. (err, client) => {
    10. if (err) {
    11. console.error('mongodn connect error', err)
    12. return
    13. }
    14. console.log('mongodb connect success')
    15. const db = client.db(dbName)
    16. // 使用集合
    17. const usersCollection = db.collection('students')
    18. // ------- 文档的操作代码写在此部分,之后将不再包含连接部分代码 -------
    19. // 查询文档
    20. usersCollection.find({ // find() 内不写内容则为查询全部文档
    21. "name" : "Axton"
    22. }).toArray((err, res) => {
    23. if (err) {
    24. console.error(err)
    25. return
    26. }
    27. console.log(res)
    28. // find() 为异步操作,为了使查询完后在关闭数据,所以放至此位置
    29. client.close()
    30. })
    31. // -------------------------------------------------------------
    32. }
    33. )
    插入文档
    1. // 插入一条数据, 插入多条可以选择 insertMany()
    2. usersCollection.insertOne({
    3. name: 'Jack',
    4. sex: '男',
    5. age: 21
    6. }, (err, res) => {
    7. if (err) {
    8. console.error(err)
    9. return
    10. }
    11. console.log(res)
    12. client.close()
    13. })
    更新文档
    1. // 更新一条数据, 更新多条可以选择 updateMany()
    2. usersCollection.updateOne(
    3. {name: 'Jack'}, // 查询条件
    4. {$set: {info: '女装'}}, // 更新的内容
    5. (err, res) => {
    6. if (err) {
    7. console.error(err)
    8. return
    9. }
    10. console.log(res)
    11. client.close()
    12. }
    13. )
    删除文档
    1. // 删除一条数据, 删除多条可以选择 deleteMany()
    2. usersCollection.deleteOne({
    3. name: 'Jack'
    4. }, (err, res) => {
    5. if (err) {
    6. console.error(err)
    7. return
    8. }
    9. console.log(res)
    10. client.close()
    11. })

    4、说明

    mongodb 是偏底层一点的插件,此处学习使用此插件是为了让大家了解连接 mongodb 的一些原理。在日常中,为了利于项目开发,通常使用 mongoose 插件

    七、Node.js 中使用 mongoose 插件连接数据库

    1、说明

    由于 mongodb 的数据格式过于灵活,容易导致多人开发时数据格式出错,使用 mongoose 可以更加规范的使用数据.

    重要名词和操作

    • Schema 定义数据格式的规范
    • 以 Model 规范 Collection
    • 规范数据操作的 API

    2、初始化环境

    安装 mongoose 插件

    npm i mongoose --save

    目录结构

    1. mongoose-test
    2. ├── package-lock.json
    3. ├── package.json
    4. ├── node_modules
    5. └── src
    6. ├── db.js
    7. ├── models
    8. │ └── Student.js
    9. └── test
    10. └── student.js

    3、创建连接服务

    db.js

    1. const mongoose = require('mongoose')
    2. const url = 'mongodb://localhost:27017'
    3. const dbName = 'myblog'
    4. mongoose.connect(`${url}/${dbName}`, {
    5. useUnifiedTopology: true,
    6. useNewUrlParser: true
    7. })
    8. const db = mongoose.connection // 将连接对象赋给 db
    9. // 发送错误
    10. db.on('error', err => {
    11. console.error(err)
    12. })
    13. // 连接成功
    14. db.on('open', () => {
    15. console.log('success!')
    16. })
    17. module.exports = mongoose

    4、定义 Schema 规范和创建模型

    models/Students.js

    1. // 对应 students 集合
    2. const mongoose = require('../db')
    3. // 用 Schema 定义数据规范
    4. const StudentSchema = mongoose.Schema({
    5. name: {
    6. type: String,
    7. required: true,
    8. unique: true
    9. },
    10. sex: String,
    11. age: Number
    12. }, {
    13. timestamps: true // 时间戳, 在插入、更新数据后将会加上相应的时间数据
    14. // 在每一条文档中加入 createdAt 和 updatedAt
    15. })
    16. // Model 对于 Collection
    17. const Student = mongoose.model('student', StudentSchema)
    18. module.exports = Student

    5、文档(Document)的操作

    test/students.js

    查询文档
    1. const Student = require('../models/Student')
    2. // 自执行的异步函数
    3. !(async () => {
    4. // 查询文档
    5. const res = await Student.find({
    6. name: 'Axton'
    7. })
    8. // 用正则表达式模糊查询文档
    9. const res2 = await Student.find({
    10. name: /A/
    11. })
    12. // 根据 ID 查询单条文档
    13. const res3 = await Student.findById('5fb2247e6469170600f02551')
    14. })()
    插入文档
    1. const Student = require('../models/Student')
    2. !(async () => {
    3. // 插入文档
    4. const res = await Student.create({
    5. name: 'Jack',
    6. age: 21,
    7. sex: '男'
    8. })
    9. })()
    更新文档
    1. const Student = require('../models/Student')
    2. !(async () => {
    3. // 更新文档
    4. const res = await Student.findOneAndUpdate(
    5. {name: 'Jack'}, // 查询的条件
    6. {sex: '女'},
    7. {
    8. new: true // 返回修改之后的内容,默认为 fasle
    9. }
    10. )
    11. })()
    删除文档
    1. const Student = require('../models/Student')
    2. !(async () => {
    3. // 删除文档
    4. const res = await Student.findOneAndDelete({
    5. name: 'Jack'
    6. })
    7. })()

    八、总结

    本文只是把 mongodb 和 node.js 连接 mongodb 等基础操作进行了整理,能用在常用的一些场景中。对于更高级的一些操作可以自行参考官方文档。如果发现本文有错误的地方或者写的不好的地方请在评论区指出。

  • 相关阅读:
    笔试面试相关记录(1)
    【达梦数据库】如何使用idea antrl4插件方式dm sql
    SpringBoot启动流程简介
    基于java+springmvc+mybatis+vue+mysql的班级管理系统
    ViewConfiguration
    Flutter入门-数据传递
    C++内存管理:其三、new和delete的行为拆分
    R语言绘制染色体变异位置分布图,RIdeogram包
    小程序学习day02-JSON配置文件、小程序页面、WXML、WXSS
    IBL(Image-Based Lighting)
  • 原文地址:https://blog.csdn.net/qq_53742640/article/details/136424861