MongoDB核心

基础概念

数据库

  • 数据库是按照数据结构来组织、存储和管理数据的仓库。
  • 在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失。
  • 我们需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。
  • 数据库就是数据持久化的最佳选择。数据库就是存储数据的仓库。

数据库分类

关系型数据库:

  • MySQL、Oracle、DB2、SQL Server ······
  • 关系型数据库中全是表

非关系型数据库:

  •  MongoDB、 Redis ······
  • 键值对数据库

MongoDB

  • MongoDB 是一个基于分布式文件存储的数据库.
  • MongoDB 是为快速开发互联网 Web 应用而设计的数据库系统。
  • MongoDB 的设计目标是极简、灵活、作为Web 应用栈的一部分。
  • MongoDB 的数据模型是面向文档的,所谓文档是一种类似于 JSON 的结构,简单理解
    MongoDB 这个数据库中存的是各种各样的JSON. (BSON)

在MongoDB中有三个重要概念:

  1. 数据库 (database):
    数据库是一个数据仓库,数据库服务下可以创建多个数据库,数居库中可以存放多个集合
  2. 集合 (collection):
    集合类似于 JS 中的数组,在集合中可以存放很多文档
  3. 文档 (document)
    文档是数据库中的最小单位,类似于 JS 中的对象

与JSON来对比:

  • JSON文件==>数据库
  • JSON中的一级数组==>集合
  • 数组中的对象==>文档 

MongoDB Shell

MongoDB Shell 是 MongoDB 提供的官方交互式界面,允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库。

MongoDB Shell 是基于 JavaScript 的,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库。

安装完成后,可以来使用 MongoDB Shell 连接到 MongoDB 数据库并执行操作。

数据库命令

1.显示所有数据库

    show dbs

2. 切换到指定的数据库

    use 数据库名

注:如果数据库不存在会自动创建数据库。如果数据库内没有集合,show dbs指令不会显示该数据库

3.显示当前所在的数据库

    db

4. 删除当前数据库

    use 库名db.dropDatabase ()

集合命令

1. 创建集合

    db.createCollection (' 集合名称 ')

2.显示当前数据库中的所有集合

    show collections

3.删除某个集合

    db. 集合名.drop

4.重命名集合

    db.集合名.renameCollection('newName')

文档命令

1.插入文档

    db. 集合名.insert (文档对象)

2.查询文档

    db. 集合名.find (查询条件)例:db.test.find({name:'张三'})

注:查询后结果中,_id 是 mongodb 自动生成的唯一编号,用来唯一标识文档

3. 更新文档

    db. 集合名.update (查询条件,新的文档)例:db. test.update ({name: 张三 '},{$set:{age:19}})

注:如果新文档不使用$set则会覆盖旧文档 

4.删除文档

    db. 集合名.remove (查询条件)

Mongoose

Mongoose简介

Mongoose (http://www.mongoosejs.net)是一个对象文档模型库

可以让我们使用代码来进行操作 mongodb 数据库

使用方法

连接数据库

首先需要安装Mongoose

    npm i mongoose
//导入mongoose
const mongoose = require('mongoose');//连接数据库  mongodb://ip:端口/数据库名
mongoose.connect('mongodb://127.0.0.1:27017/test')//设置回调函数
//连接成功回调
mongoose.connection.once('open', () => {console.log('数据库连接成功')
})//连接失败回调
mongoose.connection.once('err', () => {console.log('数据库调用失败');
})//连接关闭回调
mongoose.connection.once('close', () => {console.log('数据库连接关闭');
})//开启定时器,关闭链接
setTimeout(() => {mongoose.disconnect()
}, 3000)

创建文档结构对象和文档模型对象

//导入mongoose
const mongoose = require('mongoose')//链接数据库
mongoose.connect('mongodb://127.0.0.1:27017/dome')//创建文档结构对象
//该对象用于规定文档结构
let gameSchema = new mongoose.Schema({name: String,price: Number
})//创建文档模型对象
//该对象内封装方法,用于操作数据库
//传参(集合名,文档结构对象)
let gameModel = mongoose.model('games', gameSchema)//设置链接成功后的回调
mongoose.connection.once('open', () => {console.log('数据库连接成功');testDocumentation() //调用封装好的方法进行增删改查
})

字段值验证

 Mongoose 有一些内建验证器,可以对字段值进行验证

字段值验证在创建文档结构对象时进行

let personSchema = new mongoose.Schema({name: {type: String,required: true //必填项},age: {type: Number,default: 18 //默认值},sex: {type: String,enum: ['男', '女'] //枚举值,设置的值必须是数组中的},card: {type: Number,unique: true //唯一值,新建集合才有效果}
})

添加文档(增)

添加文档,可以使用文档模型对象中的create方法来添加,批量添加可以使用insertMany方法

添加一条时,传入参数为符合文档结构对象的对象

async function AddDocumentation() {//添加文档//使用文档模型对象中的create方法try {let add = await gameModel.create({name: '艾尔登法环',price: 298})console.log(add);} catch (error) {console.log(error);}//关闭数据库mongoose.disconnect()
}

添加多条,传入数组,数组内为符合文档结构对象的对象

//增加多条
async function AddDocumentationMany() {try {let add = await gameModel.insertMany([{name: '无限机兵',price: 159},{name: '匹诺曹',price: 298}])console.log(add);} catch (err) {console.log(err);}//关闭数据库mongoose.disconnect()
}

注:Mongoose 6.x 版本之后的 API 变更。从 Mongoose 6 开始,所有的异步操作(如 Model.create()find()save() 等)都不再支持回调函数,而是强制使用 Promise 或 async/await 语法。

控制台输出:

删除文档(删)

删除使用 deleteOne方法和deleteMany方法。

传入一个查询参数即可

deleteOne为单独删除

async function DeleteDocumentOne() {try {let Delete = await gameModel.deleteOne({_id: '68522ffc56b9a48fd708b8fc'})console.log(Delete);} catch (err) {console.log(err);}mongoose.disconnect()
}

deleteMany为批量删除

async function DeleteDocumentMany() {try {let Delete = await gameModel.deleteMany({name: '黑暗之魂1'})console.log(Delete);} catch (err) {console.log(err);}mongoose.disconnect()
}

 控制台输出:

 

更新文档(改)

更新使用 updateOne方法和updateMany方法。

需要传入两个参数,第一个为查询参数,第二个为更新参数

该方法是直接在旧文档进行修改,不存在新文档覆盖旧文档,故不用$set

updateOne为单独更新

async function UpdateDocumentOne() {try {let update = await gameModel.updateOne({ _id: '68523020764ff87f3b7cabbd' },{ name: '魂5' })console.log(update);} catch (err) {console.log(err);}mongoose.disconnect()
}

updateMany为批量更新

async function UpdateDocumentMany() {try {let update = await gameModel.updateMany({ name: '黑暗之魂3' },{ price: 99 })console.log(update);} catch (err) {console.log(err);}mongoose.disconnect()
}

 控制台输出: 

 

 查询文档(查)

查询分为单独查询,ID查询和批量查询

分别使用 findOne ( ) , findById ( ) , find ( ) 方法

单独查询需要传入查询参数,ID查询需要传入ID,批量查询传不传参数都可以

批量查询若不传参,则为查询全部数据

单独查询:

//查询一条数据
async function FindDocumentOne() {try {let find = await gameModel.findOne({ name: '无限机兵' })console.log(find);} catch (err) {console.log(err);}
}

ID查询:

//通过ID查询
async function FindDocumentID() {try {let find = await gameModel.findById('6852817f3870d51a37a2df25')console.log(find);} catch (err) {console.log(err);}
}

批量查询:

//批量查询
async function FindDocumentMany() {try {let find = await gameModel.find({ name: '魂5' })console.log(find);} catch (err) {console.log(err);}
}

控制台输出:

 条件控制

在查询文档时,我们可以设置查询的条件,来获取我们想要的数据

运算符

在mongodb中不可以使用 >  <  = 等运算符,需要使用相应的符号来替换

运算符代替符号
>$gt
<$lt
>=$gte
<=$lte
!==$ne

使用语法:

{ 属性名: { 运算符: 值 } }示例:
let find01 = await gameModel.find({ price: { $lt: 200 } })

 逻辑运算

运算符逻辑
$or逻辑或
$and逻辑与

使用语法:

{ 运算符: [{ 属性名: 值 }, { 属性名: 值 }
] }示例:
let find02 = await gameModel.find({ $or: [{ price: 298 }, { price: 99 }] })
混合用法:
let find03 = await gameModel.find({ $or: [{ price: { $lt: 300 } }, { price: { $gt: 100 } }] })

正则匹配

条件中可以直接使用正则匹配

let find04 = await gameModel.find({ name:/魂/ })let find04 = await gameModel.find({ name: new RegExp('魂') })

个性化读取

字段筛选

在读取完文档后,对象中的一部分数据并不一定是我们所需要的

可以通过字段筛选来获取我们想要的属性

语法:

文档模型对象 . find ( ) . select ( {  属性名 : 0 , 属性名: 1 } )

0:不要的字段    1:要的字段

//批量查询
async function FindDocumentMany() {try {let find01 = await gameModel.find().select({ _id: 0, name: 1, price: 1 })console.log(find01);} catch (err) {console.log(err);}mongoose.disconnect()
}

数据排序 

根据规定属性值排序

语法:

文档模型对象 . find ( ) . sort( {  属性名 : 0 / 1  } )

0:倒序  1:正序

//批量查询
async function FindDocumentMany() {try {let find01 = await gameModel.find().select({ _id: 0, name: 1, price: 1 }).sort({ price: 1 })console.log(find01);} catch (err) {console.log(err);}mongoose.disconnect()
}

数据截取

从指定位置获取到指定数量的数据

语法:

文档模型对象 . find ( ) . skip( 数字 )  //跳过几个数据

文档模型对象 . find ( ) . limit( 数字 )   //获取几个数据

//批量查询
async function FindDocumentMany() {try {let find01 = await gameModel.find().select({ _id: 0, name: 1, price: 1 }).sort({ price: 1 }).skip(2).limit(3)console.log(find01);} catch (err) {console.log(err);}mongoose.disconnect()
}

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

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

相关文章

阿里一面:微服务拆分需要考虑什么因素?

要拆分微服务&#xff0c;首先我们要了解微服务拆了会有什么问题&#xff1f;怎么合理拆服务&#xff1f; 拆分服务会带来什么问题&#xff1f; 举个电商系统下单扣库存的例子。 对于单体应用&#xff0c;通讯在进程内部进行&#xff0c;下单方法调用扣库存方法&#xff0c;…

3D高斯泼溅和4D高斯

1.高斯函数 想象你往平静的湖水里扔一块石头&#xff0c;水波会以石头落点为中心向外扩散&#xff0c;形成一个逐渐衰减的圆形波纹。高斯函数的形状就和这个波纹类似&#xff1a; 中心最高&#xff08;石头落点&#xff0c;波峰最强&#xff09;。越往外&#xff0c;高度&…

comfyui插件和comfyui mac安装

mac comfyui安装包 ComfyUI.zip&#xff0c;官方最新0.3.40&#xff0c;如果后续官方有迭代&#xff0c;可以直接通过git更新源码升级 comfyui插件下载&#xff0c;解压放到custom_nodes目录下&#xff0c;包含 comfyui-animatediff-evolved&#xff08;视频插件&#xff09; 和…

面试题SpringCloud

SpringCloud有哪些特征&#xff1f; 分布式/版本化配置服务注册与发现路由服务到服务的调用负载均衡断路器领导选举和集群状态分布式消息传递 SpringCloud核心组件&#xff1f; Eureka 注册中心Ribbon 客户端负载均衡Hystrix&#xff1a; 服务容错处理Feign:声明式Rest客户端Zu…

ASR-PRO语音识别可能出现的问题

ASR-PRO语音识别可能出现的问题 4月份有一天刷到牢大/爱丽丝语音自开关灯设备&#xff0c;心血来潮&#xff0c;博主也是浅尝了一下&#xff0c;由此也总结一下&#xff0c;实现此项目会出现的问题。 在实现爱丽丝开关灯模块时ASRPRO语音识别可能出现的问题如下&#xff1a; …

苍穹外卖--缓存菜品Spring Cache

Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; ①EHCache ②Caffeine ③Redis 常用注解…

个人简历制作MarkDown模板

MarkDown制作个人简历的模板放在了github上&#xff0c;大家如有需求&#xff0c;请自取&#xff1a; https://github.com/QQQQQQBY/ResumeTemplate 介绍一下此模板的特点&#xff1a; &#x1f338;个人面试期间使用的、整理的简历格式&#xff0c;现在分享给大家。 ⭐简历采…

【MySQL数据库 | 第五篇】DDL操作2

文章目录 当前数据库student的数据数据表操作 - 修改&删除&#x1f4d6;修改操作增加字段&#x1f44f;案例&#xff1a;向数据表student中添加字段 id修改字段的数据类型【只能修改字段的属性】&#x1f44f;案例&#xff1a;将student表中字段age的属性由tinyint unsigne…

【浏览器插件】如何开发一个Chrome浏览器插件

这篇文章来介绍一下,如何开发一个自己的Chrome浏览器插件程序。 Chrome浏览器插件,其实是让浏览器替我们执行我们自己写的代码,既然要让浏览器执行代码,那么首先,就需要定义一个规范,也就是说,需要让Chrome浏览器知道,你写的程序是一个插件。 这就需要介绍一下插件中…

详细讲解Redis为什么被设计成单线程

Redis 被设计成单线程的原因主要有以下几点&#xff0c;这些原因涉及性能优化、复杂性控制、数据一致性以及适用场景等多个方面&#xff1a; 1. 简化设计与实现 避免锁竞争&#xff1a;多线程环境下&#xff0c;多个线程访问共享资源时需要加锁来保证数据一致性。锁的使用会增…

Hive 逻辑优化器

Optimizer PointLookupOptimizer 作用&#xff1a;把符合条件的 OR 表达式转为 IN。 参数hive.optimize.point.lookup 设置是否开启 PointLookupOptimizer&#xff0c;默认为 true. 参数 hive.optimize.point.lookup.min 控制多少个 OR 表达式转为 IN&#xff0c;默认 31。 例…

ZYNQ Petalinux实战:PCIe直通NVMe固态硬盘,解锁存储性能新极限!

突破SD卡和SATA的速度枷锁!本文将手把手教你如何在ZYNQ平台上通过PCIe接口驱动NVMe固态硬盘。从硬件设计、Linux内核配置到创新性的DMA零拷贝优化,实现2000MB/s+ 的存储性能飞跃,附完整代码解析和性能实测对比。 一、为什么选择PCIe NVMe?存储性能革命 ZYNQ传统存储方案面…

05-mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server发布到PyPI官网

1前言 上期给大家介绍过mcp-server案例分享-用豆包大模型 1.6 手搓文生图视频 MCP-server。当时部署的方式使用了一个私有云SSE的部署。当时缺少一个本地部署的方式&#xff0c;有的小伙伴给我留言能不能有一个本地话部署方式了。今天就给大家带来一个本地化部署的方案。 话不…

MCP Parameters 增加描述

场景&#xff1a;本地MCP开发完后是否发现CLINE上显示的Parameters 显示No description 方法1 &#xff1a;使用参数元数据 (Annotated) 可以使用 Pydantic 的with 类提供有关参数的其他元数据Annotated。这种方法更受欢迎&#xff0c;因为它更现代&#xff0c;并且将类型提示…

STM32 GPIO 寄存器开发

&#x1f527; ​一、核心寄存器概览​ ​寄存器​​功能​​位宽​​关键位域​​GPIOx_CRL/CRH​配置引脚模式&#xff08;输入/输出/复用/模拟&#xff09;和输出参数32位每4位控制1个引脚&#xff1a;CNF[1:0]&#xff08;模式&#xff09; MODE[1:0]&#xff08;速度&am…

powershell 获取 用户及进程列表

在PowerShell中获取用户的进程列表&#xff0c;可以通过几种方法实现。以下是一些常见的方法&#xff1a; 方法1&#xff1a;使用Get-WmiObject Get-WmiObject命令可以用来查询Windows Management Instrumentation (WMI)数据库&#xff0c;从而获取关于进程和用户的信息。 # …

量化面试绿皮书:15. 假币一

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 15. 假币一 有 10个袋子&#xff0c;每个袋子里有 100个相同的硬币。 在除一个以外的所有袋子中&#xff0c;每枚硬币重10 克。 然而&#x…

Java求职者面试:Spring AI、MCP、RAG、向量数据库与Embedding模型技术解析

Java求职者面试&#xff1a;Spring AI、MCP、RAG、向量数据库与Embedding模型技术解析 第一轮&#xff1a;基础概念问题 1. 请解释Spring AI是什么&#xff1f;它与传统Spring框架有何不同&#xff1f; Spring AI是Spring生态系统的一部分&#xff0c;专注于人工智能和机器学…

tp框架导出excel的时候报错:unexcepted identifier “Closure“,excepting variable

记录一个简单的错误。 背景 用的是PhpOffice/PhpSpreadsheet 在本地环境下是可以正常导出excel的。但是线上就不行。 就会报错unexcepted identifier “Closure”&#xff0c;好像是不能用匿名函数。 首先 本地可以正常导出&#xff0c;然后服务器上不可以。看了各种日志。ph…

[Java恶补day24] 74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …