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.rhkb.cn/news/267867.html

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

相关文章

【Python】进阶学习:pandas--isin()用法详解

【Python】进阶学习:pandas–isin()用法详解 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅…

midjourney提示词语法

更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中,以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…

C++_运算符_逻辑运算符

逻辑运算符的作用 用于根据表达式的值返回真值或假值 逻辑运算符有以下符号 示例1:逻辑非 示例2:逻辑与 总结 同真为真,其余为假 示例3:逻辑或 总结 同假为假,其余为真

Git 如何上传本地的所有分支

Git 如何上传本地的所有分支 比如一个本地 git 仓库里定义了两个远程分支,一个名为 origin, 一个名为 web 现在本地有一些分支是 web 远程仓库没有的分支,如何将本地所有分支都推送到 web 这个远程仓库上呢 git push web --all

蓝桥杯(3.2)

1209. 带分数 import java.io.*;public class Main {static BufferedReader br new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw new PrintWriter(new OutputStreamWriter(System.out));static final int N 10;static int n, cnt;static int[…

云服务器租用哪家好?不要忽视第3点

注册资本:5亿元 权威认证:中央网信办云服务安全审查DJCP网络安全等级保护ITSS工信部云计算服务能力评估CSA STAR认证管理体系认证信息安全安全管理体系认证可信云服务认证可信云云主机等级评估5星 PCI-DSS支付卡行业数据安全认证 租哪家云服务器比较好&…

ssm666社区流浪动物救助领养系统的设计与开发

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一 、设计说明 1.1 课题…

如何解决微服务的数据一致性分发问题?

介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题。Netflix/Airbnb等一线互联网公司的实践[参考附录1/2/3]表明,数据一致性分发能力,是构…

windows下安装cnpm

cnpm是淘宝团队开发的一个针对中国用户的npm镜像源,它是npm的一个定制版本。由于国外的npm源在国内访问速度较慢,所以cnpm镜像源可以提供更快的下载速度。cnpm的使用方式与npm基本相同,只需将npm替换为cnpm即可。 要想使用cnpm等先安装node.…

创建型模式之原型模式

一、概述 1、工作原理:将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程 2、通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立的 3…

WordPress建站入门教程:如何在本地电脑搭建WordPress网站?

前面跟大家分享了『WordPress建站入门教程:如何安装本地WordPress网站运行环境?』,接下来boke112百科就继续跟大家分享本地电脑如何搭建WordPress网站。 小皮面板(phpstudy)的“软件管理 – 网站程序”虽然可以一键部…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:Popup控制)

给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和显示状态。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 popup弹窗的显示状态在onStateChange事件回调中反馈,其显…

RNA-Seq 笔记 [4]

***********************该笔记为初学者笔记,仅供个人参考谨慎搬运代码****************************** samtools 排序压缩和 featureCounts 生成基因计数表 SAM文件和BAM文件 1.SAM格式:是一种通用的比对格式,用来存储reads到参考序列的比…

重学SpringBoot3-@EnableConfigurationProperties注解

重学SpringBoot3-EnableConfigurationProperties注解 1. 引言2. EnableConfigurationProperties 的作用3. 使用示例4. 总结 1. 引言 Spring Boot 提供了一种便捷的方式来管理和校验应用程序的配置,即通过类型安全的配置属性。EnableConfigurationProperties 注解在…

[GXYCTF2019]BabyUpload1 -- 题目分析与详解

目录 一、题目分析 1、判断题目类型: 2、上传不同类型的文件进行测试: 二、题目详解 1、写出.htaccess文件: 2、.htaccess 文件配合 .jpg 上传: 3、利用 中国蚁剑/中国菜刀 获取flag: 一、题目分析 1、判断题目…

禅道:提bug、管理case 7.0

一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 &…

EchoServer回显服务器简单测试

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

使用 MinIO 对象存储,创建一个类似网盘的应用

Linux 的 MinIO 对象存储 MinIO 介绍 MinIO 是一个对象存储解决方案,提供与 Amazon Web Services S3 兼容的 API,并支持所有核心 S3 功能。MinIO 可以部署在任何地方。 Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供…

Kafka安全模式之身份认证

一、简介 Kafka作为一个分布式的发布-订阅消息系统,在日常项目中被频繁使用,通常情况下无论是生产者还是消费者只要订阅Topic后,即可进行消息的发送和接收。而kafka在0.9.0.0版本后添加了身份认证和权限控制两种安全服务,本文主要…

逻辑回归与决策边界解析

目录 前言1 逻辑回归基础1.1 Sigmoid函数:打开分类之门1.2 决策函数:划定分类界限1.3 逻辑回归详解 2 决策边界2.1 线性决策边界2.2 非线性决策边界2.3 决策边界的优化 3 应用与实例3.1 垃圾邮件分类:精准过滤3.2 金融欺诈检测:保…