Node.js -- mongoose

文章目录

  • 1. 介绍
  • 2. mongoose 连接数据库
  • 3. 插入文件
  • 4. 字段类型
  • 5. 字段值验证
  • 6. 文档处理
    • 6.1 删除文档
    • 6.2 更新文档
    • 6.3 读取文档
  • 7. 条件控制
  • 8. 个性化读取
  • 9. 代码模块化

1. 介绍

Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/
方便使用代码操作mongodb数据库
mangoose 本身是一个包

在这里插入图片描述
上节内容Node.js – MongoDB
我们学习了在命令行手动交互,发命令请求,项目运行阶段明显是不可行的,但是我们可以借助mongoose

2. mongoose 连接数据库

  1. 创建一个文件夹,对其npm i -y 初始化
  2. 安装npm i mongoose
  3. 创建测试文件
  4. 导入mongoose

const mongoose = require(‘mongoose’)

  1. 连接 mongodb 服务

mongoose.connect(‘服务url’)
mongoose.connect(‘mongodb://127.0.0.1/test’)
其中端口号:27017 可写可不写 因为mongodb 的默认端口就是:27017 test 指的是数据库名称

  1. 设置回调

// 设置连接成功的回调
mongoose.connection.on(‘open’,()=>{
console.log(‘连接成功’)
})

// 设置连接失败的回调
mongoose.connection.on(‘error’,()=>{
console.log(‘连接失败’)
})

// 设置连接关闭的回调
mongoose.connection.on(‘close’,()=>{
console.log(‘连接关闭’)
})
// 关闭mongodb 的连接
setTimeOut(()=>{
mongoose.disconnect()
},2000)

补充说明
在这里插入图片描述

  1. 我们运行测试文件后可能会出现上图所示的警告,如果需要规避这个警告可以在文件中添加:

mongoose.set(‘strictQuery’,true)

  1. 设置连接成功的回调 once 只执行一次
mongodb.connection.once('open',()=>{
console.log('连接成功')
})

连接服务成功会执行回调函数,但是mongodb 服务如果意外掉线,on()会重新连接服务,once() 不会再连接服务;但是官方更推荐使用once() ,因为’open’ 事件中会写一些功能代码,重连服务会出现端口被占用的情况,导致某些代码无法运行。

这部分补充内容了解即可。

3. 插入文件

const mongoose = require('mongoose')

mongoose.connect('mongodb://127.0.0.1:27017/test')

mongoose.connection.on('open', () => {
    // 1. 创建文档的结构对象
    // 设计集合中文档的属性以及属性值的类型
    let UserSchema = new mongoose.Schema({
        name: String,
        birthYear: Number,
        order:Number
    })

    // 2. 创建模型对象 对文档操作的封装对象
    // 对文档的操作需要通过UserModel 进行
    let UserModel = mongoose.model('users', UserSchema)
    
    // 3. 新增
    UserModel.create({
        name: '王一珩',
        birthYear: 2004,
        order:10
    }, (err, data) => {
        if (err) {
            console.log(err);
        } 
        // 没有出错就输出插入后的文档对象
        console.log(data);
        // 关闭连接 但是项目运行阶段一般都不会关闭
        mongoose.disconnect()
    })
   
})

mongoose.connection.on('error', () => {
    console.log('连接失败');
})

mongoose.connection.on('close', () => {
    console.log('连接关闭');
})
// 设置服务在2s 后关闭
setTimeout(() => {
    mongoose.disconnect()
}, 2000)

4. 字段类型

文档结构可选的常用字段类型列表
字段类型也可以说是指文档对象的属性值类型

类型描述
String字符串
Number数字
Boolean布尔值
Array数组,也可以使用[ ]来标识
Date日期
BufferBuffer对象
Mixed任意类型,需要使用mongoose.Schema.Types.Mixed 指定
Objected对象ID,需要使用mongoose.Schema.Types.Objected
Decimal128高精度数字,需要使用mongoose.Schema.Types.Decimal128

存储视频、图片一般都是存储在静态资源文件夹下,把相应的url 以字符串的形式存储在数据库中,使用的时候就按照url 到数据库中寻找;

Objected :一般用来做外键,就是将一个文档的ID存储到另一个文档中,当需要这个文档的数据是就通过ID 进行数据查询;

5. 字段值验证

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

  1. 必填项

title:{
type:String,
required:true}

  1. 默认值

author:{
type: String,
default: ‘匿名’
} // 设置文档对象没有传入author值,那author 值默认就为 匿名

  1. 枚举值

gender:{
type:String,
enum:[‘男’,‘女’]
} // 设置的值必须是数组中的

  1. 唯一值

username:{
type:String,
unique: true
}
unique 需要重建集合才有效,也就是创建新的集合

6. 文档处理

6.1 删除文档

  1. 删除单条数据
// 创建模型对象对文档操作的封装对象 mongoose会使用集合名称的复数,创建集合
let BookModel = mongoose.model('novel',BookSchema);
// 集合名称就为novels
// 删除一条
BookModel.deleteOne({_id:'63f34af50cf203761ede1892'},(err,data)=>{
//判断
if(err){
console.log('删除失败')return;
}
//输出data
console.log(data);

  1. 批量删除
BookModel.deleteMany({is_hot:false},(err,data)=>{
//判断
if(err){
console.1og('删除失败')return;
}
//输出data
console.log(data);
})

6.2 更新文档

  1. 更新一条
BookModel.updateOne({name:'红楼梦'},{price:9.9},(err,data)=>{
//判断 err
if (err) {
console.log('更新失败')
return
}
// 输出data
console.log(data);
  1. 批量更新
//批量更新
BookModel.updateMany({author:''},{is_hot:true},(err,data)=>{
//判断
if(err){
console.log('更新失败');
return;
}
//输出data
console.log(data);
})

6.3 读取文档

  1. 读取一条
BookModel.findOne({name:'红楼梦'},(err,data)=>{
//判断 err
if (err) {
console.log('读取失败')
return
}
// 输出data
console.log(data);

// 也可以使用根据ID 获取数据  findById()
BookModel.findById({id:'12345678790'},(err,data)=>{
//判断 err
if (err) {
console.log('读取失败')
return
}
// 输出data
console.log(data);
  1. 批量读取
BookModel.find({author:''},(err,data)=>{
//判断
if(err){
console.log('读取失败');
return;
}
//输出data
console.log(data);

  1. 读取所有
BookModel.find((err,data)=>{
//判断
if(err){
console.log('读取失败');
return;
}
//输出data
console.log(data);
})

7. 条件控制

  1. 运算符
    本节内容的代码中我们都是通过 ‘=’ 进行检索内容,但是其他的运算符也可以进行检索内容。

在mongodb不能><>=<=!=等运算符,需要使用替代符号

  • ‘>’ 使用$ gt
  • ‘<’ 使用$ lt
  • ‘>=’ 使用$ gte
  • ‘<=’ 使用$ lte
  • ‘!==’ 使用$ ne

db.students.find({id: {$ gt: 3}) id号比3大的所有记录

let BookModel = mongoose.model('novel',BookSchema);
// 价格<20的图书
BookModel.find({price:{$lt:20}},(err,data)=>{
if(err)
console.log('读取失败')return;
console.log(data);
})
  1. 逻辑运算

$or 逻辑或的情况

db.students.find({$or [{age:18},{age:24}]))

$and 逻辑与的情况

db.students.find({$ and: [{age:{$ lt:20}},{age: {$gt:15}}]});

  1. 正则匹配
    条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询

db.students.find({name: /imissyou/ }) // 找出name 中含有imissyou 的文档对象

8. 个性化读取

  1. 字段筛选
// 0:不要的字段
// 1:要的字段
SongModel.find().select({_id:0,title:1}).exec(function(err,data)=>{
if(err){
console.log(err)
}
console.log('data')
mongoose.connection.close()
})

在这里插入图片描述

  1. 数据排序
// sort 排序
// 1:升序
// -1:倒序
SongModel.find().select({_id:0,price:1}).sort({price:-1}).exec(function(err,data)=>{
if(err){
console.log(err)
}
console.log('data')
mongoose.connection.close()
})
  1. 数据截取
// 取前三个
SongModel.find().select({_id:0,price:1}).sort({price:-1}).limit(3).exec(function(err,data)=>{
if(err){
console.log(err)
}
console.log('data')
mongoose.connection.close()
})

// 取第4-6位
SongModel.find()
.select({_id:0,price:1})
.sort({price:-1})
.skip(3)
.limit(3)
.exec(function(err,data)=>{
if(err){
console.log(err)
}
console.log('data')
mongoose.connection.close()
})

9. 代码模块化

  • 创建连接部分
  1. 新建文件夹db 接着新建文件db ,再其中把创建连接代码部分放入暴露的函数中
    在这里插入图片描述
    注意:
    连接成功泽调用success 函数,连接失败调用error函数

  2. 导入函数,调用函数,传入success、error函数
    在这里插入图片描述

  • 创建结构对象和模型对象部分
  1. 创建modules 文件夹 再创建BookModel.js ,放入重复创建的代码部分;
    在这里插入图片描述

  2. 只需要在文件中导入两部分模板内容,传入函数的success和error 参数

在这里插入图片描述

  • 模板化调用函数的error参数部分
  1. 不再传入error参数
  2. 判断error 是否为函数
    在这里插入图片描述
  • 配置文件

连接的url、端口号、集合都有可能发生改变,所以我们可以把其中内容写入到配置文件中,将来再修改的时候也更加方便;

  1. 创建config 文件夹 ,在创建config 文件,放入url、端口号、集合等内容
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【跟马少平老师学AI】-【神经网络是怎么实现的】(七-2)word2vec模型

一句话归纳&#xff1a; 1&#xff09;CBOW模型&#xff1a; 2c个向量是相加&#xff0c;而不是拼接。 2&#xff09;CBOW模型中的哈夫曼树&#xff1a; 从root开始&#xff0c;向左为1&#xff0c;向右为0。叶子结点对应词有中的一个词。每个词对应唯一的编码。词编码不等长。…

Debian 12 tomcat 9 catalina 日志信息 中文显示乱码

目录 问题现象 解决办法&#xff1a; 1、设定Debian locale 2、设定catalina.sh utf8字符集 问题现象 Debian 12 linux操作系统中&#xff0c;tomcat 9 catalina 启动日志输出 中文乱码 解决办法&#xff1a; 1、设定Debian locale 先确保系统本身就支持中文的 Debian …

Python 全栈体系【四阶】(三十八)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.2 YOLO 系列 3.2.1 YOLOv1&#xff08;2016&#xff09; 3.2.1.1 基本思想 YOLO&#xff08;You Only Look Once &#xff09;是继 RCNN&#xff0c;fast-RCNN 和 faster-RCNN 之后&#xff0c;Ross Girshick 针对 DL 目…

【C++】set与map的使用

目录 一、set&#xff1a; 1、set介绍&#xff1a; 2、常用构造&#xff1a; 3、常用修改操作&#xff1a; &#xff08;1&#xff09;insert&#xff1a; &#xff08;2&#xff09;find &#xff08;3&#xff09;erase&#xff1a; 4、其他操作&#xff1a; &#…

【linuxC语言】守护进程

文章目录 前言一、守护进程的介绍二、开启守护进程总结 前言 在Linux系统中&#xff0c;守护进程是在后台运行的进程&#xff0c;通常以服务的形式提供某种功能&#xff0c;如网络服务、系统监控等。守护进程的特点是在启动时脱离终端并且在后台运行&#xff0c;它们通常不与用…

docker系列9:容器卷挂载(下)

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

Vue Cli脚手架—安装Nodejs和Vue Cli

一&#xff0c;Vue Cli 文档地址: https://cli.vuejs.org/zh/ 二&#xff0c;.环境配置&#xff0c;搭建项目 1.安装node.js 2.下载 node.js10.16.3 地址: https://nodejs.org/en/blog/release/v10.16.3/ 3.安装 node.js10.16.3 , 直接下一步即可, 安装到 d:\program\nodejs…

iOS 创建依赖其他开源库的开源库

参考文章&#xff08;感激各位大神前路的明灯&#xff09; 参考文章一 参考项目 整体流程 流程简介 1&#xff09;使用pod命令行创建本地项目和git仓库并回答终端里的四个问题 2&#xff09;编辑podspec文件 3&#xff09;将需要开源的代码添加到Development Pods文件夹中&am…

Python量化炒股的获取数据函数—get_fundamentals_continuously()

Python量化炒股的获取数据函数—get_fundamentals_continuously() get_fundamentals()函数只能用于查询某一交易日的股票财务数据信息&#xff0c;如果要查询多个交易日的股票财务数据信息&#xff0c;就要使用get_fundamentals_continuously()函数&#xff0c;语法格式如下&a…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.0

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

手机配置在线检测工具微信小程序源码

手机配置在线检测工具微信小程序源码&#xff0c;这是一款升级版检测工具&#xff0c;自动检测手机真伪,序列号等。另外还可以给手机检测各项功能是否正常。 支持多做流量主模式,还有外卖CPS,和友情小程序推荐等 源码免费下载地址 抄笔记(chaobiji.cn)

Servlet(一些实战小示例)

文章目录 一、实操注意点1.1 代码修改重启问题1.2 Smart Tomcat的日志1.3 如何处理错误 一. 抓自己的包二、构造一个重定向的响应&#xff0c;让页面重定向到百度主页三、让服务器返回一个html数据四、表白墙4.1 约定前后端数据4.2 前端代码4.3 后端代码4.4 保存在数据库的版本…

【学习vue 3.x】(二)组件应用及单文件组件

文章目录 章节介绍本章学习目标学习前的准备工作Vue.js文件下载地址 组件的概念及组件的基本使用方式组件的概念组件的命名方式与规范根组件局部组件与全局组件 组件之间是如何进行互相通信的父子通信父子通信需要注意的点 组件的属性与事件是如何进行处理的组件的属性与事件 组…

软件测试(实验五)——Jmeter的使用

目录 实验目的 一、使用JMeter演示取样器、监听器、配置元件、断言的使用&#xff1b; 1、取样器 2、监听器 3、配置元件的使用 ① 用户定义的变量 ②HTTP信息头管理器 ③HTTP请求默认值 ④CSV数据文件设置 4、断言 ①响应断言 ②JSON断言 ③断言持续时间 二、使用…

C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解

目录 前言 一、原码、反码、补码 二、移位操作符 三、位操作符&#xff1a;&、|、^、~ 四、经典例题分析&#xff1a; 总结 前言 本文将详细介绍C语言中左移操作符<<&#xff0c;右移操作符>>&#xff0c;按位与&&#xff0c;按位或|&#xff0c;按位异或^…

【QT学习】14补充,使用线程制作绘图工具

思路&#xff1a; 结果&#xff1a; 点击刷新图片&#xff0c;自动绘制一个六点连接图 线程类的属性 线程类的函数实现 void MyThread::drawImage(){//Qimage设备QImage image(600,600,QImage::Format_ARGB32);//画家QPainter p(&image);//画笔&#xff0c;画刷QPen pen;pe…

进位计数制

目录 前言 最古老的计数方法 十进制数 推广:r 进制计数法 任意进制->十进制 二进制<->八进制,十六进制 十进制->任意进制 真值和机器数 总结: 前言 本篇文章我们正式进入第二章:数据的表示和运算,通过第一章的学习我们知道了现代计算机的结构 那数据如何…

基于php+mysql+html图书管理系统(含实训报告)

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

自然语言处理 (NLP) 中的迁移学习

--懂王 在大数据高速发展的时代&#xff0c;AI的发展日新月异&#xff0c;充满挑战的迎接未来。 自然语言处理 (NLP) 中的迁移学习: 迁移学习在 NLP 中越来越受欢迎&#xff0c;特别是在数据稀缺的情况下。如何有效地利用预训练的语言模型&#xff0c;并将其迁移到新的任务和领…

kubectl_入门_service详解

Service 我们知道 Pod 的生命周期是有限的。可以用 ReplicaSet 和Deployment 来动态的创建和销毁 Pod&#xff0c;每个 Pod 都有自己的 IP 地址&#xff0c;但是如果 Pod 重建了的话那么他的 IP 很有可能也就变化了。 这就会带来一个问题&#xff1a;比如我们有一些后端的 Po…