Mongodb基础(node.js版)

news2024/11/6 3:15:39

一、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、查看操作

# 查看有哪些数据库
show dbs

# 创建或进入数据库 (当数据库不存在即创建)
use dbName

# 查看有哪些集合
show collections

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

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

3、显示集合中的文档

# 显示集合中全部文档
db.collName.find()

# 显示集合中特定文档
db.collName.find({ "name":"Axton" })

# 排序,按 ID 倒序排序
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、初始化环境

# 初始化 node.js 环境
npm init -y

# 安装 mongodb 模块
npm i mongodb --save

 2、连接到 Mongodb

const MongoClient = require('mongodb').MongoClient

const url = 'mongodb://localhost:27017'		// 默认端口号为 27017 ,如修改过请自行更改
const dbName = 'mydb'		// 需要连接的数据库名字

MongoClient.connect(
  url,
  {
    // 配置 (默认写上就好)
    useUnifiedTopology: true
  },
  (err, client) => {
    if (err) {
      console.error('mongodn connect error', err)
      return
    }

    console.log('mongodb connect success')

    // 切换到数据库
    const db = client.db(dbName)

    // 关闭连接
    client.close()
  }
)

3、文档(Document)的操作

查询文档
const MongoClient = require('mongodb').MongoClient

const url = 'mongodb://localhost:27017'
const dbName = 'mydb'

MongoClient.connect(
  url, 
  {
    useUnifiedTopology: true
  },
  (err, client) => {
    if (err) {
      console.error('mongodn connect error', err)
      return
    }
    console.log('mongodb connect success')
    const db = client.db(dbName)

    // 使用集合
    const usersCollection = db.collection('students')

    // ------- 文档的操作代码写在此部分,之后将不再包含连接部分代码 -------
    // 查询文档
    usersCollection.find({	// find() 内不写内容则为查询全部文档
        "name" : "Axton"
    }).toArray((err, res) => {
      if (err) {
        console.error(err)
        return
      }
      console.log(res)

      // find() 为异步操作,为了使查询完后在关闭数据,所以放至此位置
      client.close()
    })
    // -------------------------------------------------------------
  }
)
插入文档
// 插入一条数据, 插入多条可以选择 insertMany()
usersCollection.insertOne({
  name: 'Jack',
  sex: '男',
  age: 21
}, (err, res) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(res)
  client.close()
})
更新文档
// 更新一条数据, 更新多条可以选择 updateMany()
usersCollection.updateOne(
  {name: 'Jack'},   // 查询条件
  {$set: {info: '女装'}},   // 更新的内容
   (err, res) => {
     if (err) {
       console.error(err)
       return
     }
     console.log(res)
     client.close()
  }
)
删除文档
// 删除一条数据, 删除多条可以选择 deleteMany()
usersCollection.deleteOne({
    name: 'Jack'
}, (err, res) => {
    if (err) {
        console.error(err)
        return
    }
    console.log(res)
    client.close()
})

4、说明

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

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

1、说明

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

重要名词和操作

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

2、初始化环境

安装 mongoose 插件

npm i mongoose --save

目录结构

mongoose-test
├── package-lock.json
├── package.json
├── node_modules
└── src
    ├── db.js
    ├── models
    │	  └── Student.js
    └── test
   	  └── student.js

3、创建连接服务

db.js

const mongoose = require('mongoose')

const url = 'mongodb://localhost:27017'
const dbName = 'myblog'

mongoose.connect(`${url}/${dbName}`, {
  useUnifiedTopology: true,
  useNewUrlParser: true
})

const db = mongoose.connection    // 将连接对象赋给 db

// 发送错误
db.on('error', err => {
  console.error(err)
})

// 连接成功
db.on('open', () => {
  console.log('success!')
})

module.exports = mongoose

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

models/Students.js

// 对应 students 集合

const mongoose = require('../db')

// 用 Schema 定义数据规范
const StudentSchema = mongoose.Schema({
  name: {
    type: String,
    required: true,
    unique: true
  },
  sex: String,
  age: Number
}, {
  timestamps: true  // 时间戳, 在插入、更新数据后将会加上相应的时间数据
  // 在每一条文档中加入 createdAt 和 updatedAt
})

// Model 对于 Collection
const Student = mongoose.model('student', StudentSchema)

module.exports = Student

5、文档(Document)的操作

test/students.js

查询文档
const Student = require('../models/Student')

// 自执行的异步函数
!(async () => {
    
  // 查询文档
  const res = await Student.find({
    name: 'Axton'
  })

  // 用正则表达式模糊查询文档
  const res2 = await Student.find({
    name: /A/
  })
  
  // 根据 ID 查询单条文档
  const res3 = await Student.findById('5fb2247e6469170600f02551')

})()
插入文档
const Student = require('../models/Student')

!(async () => {
    
  // 插入文档
  const res = await Student.create({
    name: 'Jack',
    age: 21,
    sex: '男'
  })

})()
更新文档
const Student = require('../models/Student')

!(async () => {

  // 更新文档
  const res = await Student.findOneAndUpdate(
    {name: 'Jack'},   // 查询的条件
    {sex: '女'},
    {
      new: true  // 返回修改之后的内容,默认为 fasle
    }
  )

})()
删除文档
const Student = require('../models/Student')

!(async () => {

  // 删除文档
  const res = await Student.findOneAndDelete({
    name: 'Jack'
  })

})()

八、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RFID(Radio Frequency Identification)技术笔记

一、RFID的介绍 RFID,全称为Radio Frequency Identification,即射频识别技术,也常被称为电子标签或无线射频识别。它是一种非接触式的自动识别技术,通过射频信号自动识别目标对象并获取相关数据,识别过程无需人工干预&…

VMwareWorkstation17.0搭建Windows98微软操作系统虚拟机(完整安装步骤·全网最详细图文教程)更新中

VMwareWorkstation17.0搭建Windows98微软操作系统虚拟机(完整安装步骤全网最详细图文教程) VMwareWorkstation17.0搭建Windows98微软操作系统虚拟机(完整安装步骤全网最详细图文教程)

Cloud整合Zookeeper代替Eureka

微服务间通信重构与服务治理笔记-CSDN博客 Zookeeper是一个分布式协调工具,可以实现注册中心功能 安装Zookeeper 随便 就用最新版本吧 进入Zookeeper 包目录 cd /usr/local/develop/ 解压 tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz -C /usr/local/develop 进入配置文件…

Web开发介绍,制作小网站流程和需要的技术【详解】

1.什么是web开发 Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站。 所以Web开发说白了,就是开发网站的,例如网站:淘宝,京东等等 2. 网站的工作流程 1.首先我们需…

服务器有几种http强制跳转https设置方法

目前为站点安装SSL证书开启https加密访问已经是件很简单的事了,主要是免费SSL证书的普及,为大家提供了很好的基础。 Apache环境下如何http强制跳转https访问。Nginx环境下一般是通过修改“你的域名.conf”文件来实现的。 而Apache环境下通过修改.htacces…

<网络安全>《63 微课堂<第3课 旁路部署和串行部署是什么?>》

1、串联和并联概念 串联和并联是物理学上的概念。 串联电路把元件逐个顺次连接起来组成的电路。如图,特点是:流过一个元件的电流同时也流过另一个。 并联电路把元件并列地连接起来组成的电路,如图,特点是:干路的电流…

ctf_show笔记篇(web入门---爆破)

爆破 21:直接bp抓包跑字典,需base64加密 22:可用工具跑也可用浏览器找还可以用网上做好的域名查找去找 23:此题需跑脚本已经附上自写脚本 最后跑出来六个答案一个一个尝试得到答案为3j import hashlibm "0123456789qwert…

【Django】执行查询——查询JSONField

JSONField 本篇的例子以下面这个模型为基础: from django.db import modelsclass Dog(models.Model):name models.CharField(max_length200)data models.JSONField(nullTrue)def __str__(self):return self.name保存和查询None值 在使用JSONField时&#xff0c…

09 闭环线程 LoopClosing

文章目录 09 闭环线程 LoopClosing9.1 主函数:Run()9.1.1 闭环检测9.1.2 计算Sim3变换(相似变换): ComputeSim3()9.1.4 闭环矫正: CorrectLoop() 09 闭环线程 LoopClosing 9.1 主函数:Run() 成员函数/变量访问控制意义CheckNewK…

基础二分学习笔记

模板 : 个人倾向第一种 ; 整数二分 : 最大化查找 : 可行区域在左侧 : 查找最后一个<q的数的下标 : int find(int q){// 查找最后一个 < q 的下标 int l 0 , r n 1 ;while(l 1 < r){int mid l r >> 1 ;if(a[mid]<q) l mid ;else r mid ;}return…

微信小程序云开发教程——墨刀原型工具入门(编辑页面)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

CTFHUB 命令执行

命令执行 原理&#xff1a; 在编写程序的时候&#xff0c;当碰到要执行系统命令来获取一些信息时&#xff0c;就要调用外部命令的函数&#xff0c;比如php中的exec()、system()等&#xff0c;如果这些函数的参数是由用户所提供的&#xff0c;那么恶意用户就可能通过构造命令拼…

python统计分析——泊松回归

参考资料&#xff1a;用python动手学统计学 概率分布为泊松分布、联系函数为对数函数的广义线性模型叫作泊松回归。解释变量可以有多个&#xff0c;连续型和分类型的解释变量也可以同时存在。 1、案例说明 分析不同气温与啤酒销量的关系。构造不同气温下的销量的数学模型&…

LeetCode 热题 HOT 100(P1~P10)

&#x1f525; LeetCode 热题 HOT 100 这里记录下刷题过程中的心得&#xff0c;其实算法题基本就是个套路问题&#xff0c;很多时候你不知道套路或者模板&#xff0c;第一次尝试去做的时候就会非常懵逼、沮丧和无助。而且就算你一时理解并掌握了&#xff0c;过一段时间往往会绝…

Unity--自动版面(Horizontal Layout Croup)||Unity--自动版面(Vertical Layout Group)

Unity--自动版面&#xff08;Horizontal Layout Croup&#xff09; Horizontal Layout Croup&#xff1a; “水平布局组”组件将其子布局元素并排放置。它们的宽度由各自的最小&#xff0c;首选和灵活的宽度决定&#xff0c;具体取决于以下模型&#xff1a; 所有子布局元素的…

【数据结构】知识点一:线性表之顺序表

内容导航 一、什么是线性表&#xff1f;二、什么是顺序表&#xff1f;1、顺序表的概念2、顺序表的结构a. 静态顺序表&#xff1a;使用定长数组存储元素。b. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、顺序表的接口实现精讲1.接口一&#xff1a;打印数据2.接口二&…

Vue组件置底方法,ElementPlus布局

问题描述 在开发网页时使用了elementplus的el-container组件 组件里分成了main和footer两块&#xff0c;但是想要将两个按钮置底在容器底部遇到了困难 如下图所示&#xff0c;在网页开发者工具可见两个按钮与左侧的图片没有底部对齐 此时我的代码是这样 <el-footer>&…

探讨倒排索引Elasticsearch面试与实战:从理论到实践

在当前大数据时代&#xff0c;Elasticsearch&#xff08;以下简称为ES&#xff09;作为一种强大的搜索和分析引擎&#xff0c;受到了越来越多企业的青睐。因此&#xff0c;对于工程师来说&#xff0c;掌握ES的面试准备和实战经验成为了必备技能之一。本文将从ES的面试准备和实际…

Redis高级特性和应用(发布、订阅、Stream、慢查询、Pipeline、事务、Lua)

Redis高级特性和应用 发布和订阅 Redis提供了基于“发布/订阅”模式的消息机制&#xff0c;此种模式下&#xff0c;消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息&#xff0c;订阅该频道的每个客户端都可以收到该消息。 操作命令 Redis主要…

专为大模型训练优化,百度集合通信库 BCCL 万卡集群快速定位故障

1 集合通信对分布式训练至关重要 在分布式训练中&#xff0c;每一块 GPU 只负责处理部分模型或者数据。集群中不同 GPU 之间通过集合通信的方式&#xff0c;完成梯度同步和参数更新等操作&#xff0c;使得所有 GPU 能够作为一个整体加速模型训练。 如果有一块 GPU 在集合通…