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

# 查看有哪些数据库
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').MongoClientconst 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').MongoClientconst 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.mzph.cn/news/716201.shtml

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

相关文章

Java玩转《啊哈算法》之模拟链表

人应该支配习惯,而绝不是让习惯支配人。一个人要是不能改掉坏习惯,那么他就一文不值。 目录 缘代码地址模拟链表创建遍历打印插入插入优化 完整代码 缘 各位小伙伴们好呀!本人最近看了下《啊哈算法》,写的确实不错。 但稍显遗憾…

【C++】string 类 ( 上)

标准库中的string类 注意: 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。 比特就业课 3. string在底层实际是:basic_string模板类的别名,typedef basi…

python爬虫之selenium知识点记录

selenium 一、前期准备 1、概述 selenium本身是一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源。 我们可以利用selenium提供的各项功能。 帮助我们完成数据的抓取。 2、学习目标 掌握 selenium发送请求,加载网页的方法 掌…

Stable-Diffusion ubuntu服务器部署,报错解决方法(小白教程)

Stable Diffusion是一个深度学习模型,专注于生成高质量的图像。它由CompVis团队与Stability AI合作开发,并在2022年公开发布。这个模型使用文本提示(text prompts)生成详细、逼真的图像,是目前人工智能图像生成领域的一…

逆向案例四:360k静态和精灵数据动态AES解密,用js的方法

一、360K 网页链接:https://www.36kr.com/p/2672600261670407 页面中有静态的需要解密的内容,确定html包,确定方法 1.1方法步骤 在下方的搜索中输入decrypt(或者关键字window.initialState ,进入js文件 在AES.decrypt处打上断点&#xff0…

机器学习-03-机器学习算法流程

总结 本系列是机器学习课程的第02篇,主要介绍机器学习中专家系统的应用介绍 本门课程的目标 完成一个特定行业的算法应用全过程: 定义问题(Problem Definition) -> 数据收集(Data Collection) -> 数据分割(Dataset Spit…

守护无价数据:文件备份的重要性与实用策略

一、数据安全:为何文件备份至关重要 在数字化时代,我们的生活和工作越来越离不开电子设备与其中的文件数据。这些文件可能包含重要的工作文档、珍贵的家庭照片、个人的创意作品等,它们是我们回忆的载体,也是我们工作和创新的基石…

PDF Expert for Mac v3.9.2中文激活版下载

PDF Expert for Mac是一款易于使用的 PDF 编辑器和注释器,专为 Mac 设备设计。它允许用户轻松查看、编辑、签名、注释和共享 PDF。该软件使用户能够向他们的 PDF 添加文本、图像、链接和形状,突出显示和标记文本,填写表格以及签署数字文档。它…

金融行业专题|期货超融合架构转型与场景探索合集(2023版)

更新内容: 更新 SmartX 超融合在期货行业的覆盖范围、部署规模与应用场景。新增 CTP 主席系统实践与评测、容器云资源池等场景实践。更多超融合金融核心生产业务场景实践,欢迎下载阅读电子书《SmartX 金融核心生产业务场景探索文章合集》。 面对不断变…

mac iNode 断开后没网 经测试 后台还在运行

界面断开,但是连不上网:实际上可能是服务在后台还在运行 解决方式:终端执行命令 ,手动停止iNode服务 sudo /Library/StartupItems/iNodeAuthService/iNodeAuthService stop 停掉之后,有可能连不上网,断开wi…

基于springboot+vue的美食推荐商城

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

网工必懂的ICMP协议

福建厦门微思网络始于2002年,面向全国招生! 主要课程:华为、思科、红帽、Oracle、VMware、CISP安全系列、PMP....... 网络工程师实用课程华为HCIA课程介绍 网络工程师使用课程华为HCIP课程介绍 网络工程师使用课程华为HCIE课程介绍 因特网…

更详细的软件测试理论基础:流程,开发、测试模型,测试分类,测试用例及其设计方法,缺陷

文章目录 一、测试流程二、开发模型1、 瀑布模型2、增量模型3、快速模型4、其他 三、测试模型1、V模型2、W模型 四、测试分类五、测试用例 test case六、测试用例设计方法1、等价类划分法2、边界值分析法3、因果图法4、判定表法5、正交法6、场景法7、流程分析法8、错误推测法方…

数据分析-Pandas数据的探查面积图

数据分析-Pandas数据的探查面积图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…

第16章-DNS

目录 1. 域名 1.1 产生背景 1.2 概述 1.3 域名的树形层次化结构 2. DNS 2.1 概述 2.2 工作机制 3. DNS查询模式 3.1 递归查询: 3.2 迭代查询: 4. 相关知识点 4.1 集中式DNS 4.2 国内通用DNS 4.3 配置DNS代理 1. 域名 1.1 产生背景 ① IP…

【Excel PDF 系列】iText 库直接实现表格 PDF

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 文章目录 前言生成表格 PDF 效果引入 pom 配置代码实现定义 CreateExcelToPdfModel 对象主方法 前言 最近遇到生成 E…

EchoServer回显服务器简单测试

目录 工具介绍 工具使用 测试结果 工具介绍 github的一个开源项目,是一个测压工具 EZLippi/WebBench: Webbench是Radim Kolar在1997年写的一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的…

二维码门楼牌管理系统:城市数字化管理的新里程碑

文章目录 前言一、二维码门楼牌管理系统的构成二、二维码门楼牌管理系统的功能三、二维码门楼牌管理系统的应用四、二维码门楼牌管理系统的未来发展 前言 随着城市管理的数字化、智能化水平不断提升,二维码门楼牌管理系统作为一种创新的城市管理方法,正…

Ubuntu20.04: UE4.27 中 Source Code 的编辑器下拉框没有 Rider选项

问题描述 最近想用 Rider 作为 UE4 开发的 IDE,但安装好 Rider 后,发现编辑器下拉框中没有 Rider 的选项,我检查了 UE4 的插件,发现 Rider Integration 插件已经安装且启用的。 环境:Ubuntu 20.04 UE4.27 Rider2023…

应急加电电源车-在航空航天、武器等多领域的应用

应急加电电源车是一种专门设计用于在紧急情况下为其他设备提供电力支持的车辆。它通常由电池或燃料电池驱动,可以在没有外部电源的情况下为其他设备提供持续的电力供应。这种车辆在灾难救援、野外作业、军事行动等领域具有广泛的应用。 应急加电电源车通常具有以下…