Mongoose【node.js的优雅mongodb对象建模】

news2024/11/17 15:40:13

Mongoose基础运行流程:

文章目录

  • Mongoose基础运行流程:
  • 官方 Docs 地址
  • 1. 安装:
  • 2. 使用:
    • 2.1 目录结构:
    • 2.2 初始化连接实例 [ 创建 DBHelper.js ]
      • 2.2.1 链接地址书写格式[ mongoose.connect(参数格式 )]:
      • 2.2.2 完整DBHelper.js
      • 附:connection事件种类
    • 2.3 创建Model
      • 2.3.1 注意事项:
        • (1): Model的使用基于Schema [ 先定义Schema ]
        • (2): Mongoose Model预设默认行为!!
        • (3): 解决(2)中的Modle预设默认行为
      • 2.3.2 完整users.js
    • 2.4 对应 Model 操作对应数据库表内容 [ 基于 2.2 , 2.3]

官方 Docs 地址

Mongoose 官方文档

1. 安装:

npm install mongoose --save

2. 使用:

2.1 目录结构:

在这里插入图片描述

  • config文件夹-index.js:集中存放配置信息;

    示例:

    const DB_URL = 'mongodb://localhost:27017/admin';
    exports.DB_URL = DB_URL;
    
  • model: mongoose Model users.js 即表示数据库users表;

2.2 初始化连接实例 [ 创建 DBHelper.js ]

2.2.1 链接地址书写格式[ mongoose.connect(参数格式 )]:

不含校验:mongodb://域名:端口/数据库名称

mongoose.connect('mongodb://localhost:27017/test');

含校验:mongodb://用户名:密码@域名:端口/数据库名称

mongoose.connect('mongodb://user:password@localhost:27017/test')

2.2.2 完整DBHelper.js

const mongoose = require('mongoose');

const config = require('./index');
const { DB_URL } = config;

/* 
    捕捉建立初始连接时的错误 
    注意:两种错误捕捉注意区分,避免遗漏
    	1. 捕捉建立初始连接时的错误 
    	2. 捕捉建立初始连接[ 后 ]的错误;
*/
async function main() {
    await mongoose.connect(DB_URL);

    // use `await mongoose.connect('mongodb://user:password@localhost:27017/test');` if your database has auth enabled
}
main().catch(err => console.log(err));

/* 
    监测连接成功
*/
mongoose.connection.on('connected', () => {
    console.log('连接成功')
});
/* 
    捕捉建立初始连接[ 后 ]的错误;
*/
mongoose.connection.on('error', err => {
    logInfo(err, 'error');
});
/* 
    监测断开链接
*/
mongoose.connection.on('disconnected', back => {
    logInfo(back, 'disconnected');
});

const logInfo = (err, which) => {
    console.log(err + '-' + which)
}

exports.mongoose = mongoose;

附:connection事件种类

mongoose.connection事件 - Connection Events

  • connecting: Emitted when Mongoose starts making its initial connection to the MongoDB server
  • connected: Emitted when Mongoose successfully makes its initial connection to the MongoDB server, or when Mongoose reconnects after losing connectivity. May be emitted multiple times if Mongoose loses connectivity.
  • open: Emitted after 'connected' and onOpen is executed on all of this connection’s models.
  • disconnecting: Your app called Connection#close() to disconnect from MongoDB
  • disconnected: Emitted when Mongoose lost connection to the MongoDB server. This event may be due to your code explicitly closing the connection, the database server crashing, or network connectivity issues.
  • close: Emitted after Connection#close() successfully closes the connection. If you call conn.close(), you’ll get both a ‘disconnected’ event and a ‘close’ event.
  • reconnected: Emitted if Mongoose lost connectivity to MongoDB and successfully reconnected. Mongoose attempts to automatically reconnect when it loses connection to the database.
  • error: Emitted if an error occurs on a connection, like a parseError due to malformed data or a payload larger than 16MB.
  • fullsetup: Emitted when you’re connecting to a replica set and Mongoose has successfully connected to the primary and at least one secondary.
  • all: Emitted when you’re connecting to a replica set and Mongoose has successfully connected to all servers specified in your connection string.

2.3 创建Model

2.3.1 注意事项:

(1): Model的使用基于Schema [ 先定义Schema ]

const schema = new mongoose.Schema({ name: 'string', size: 'string' });
const Tank = mongoose.model('Tank', schema);

(2): Mongoose Model预设默认行为!!

【注意!!】第一个参数是模型所针对的集合的单数名称。Mongoose会自动查找型号名称的复数小写版本。因此,对于上面的示例,模型Tank用于数据库中的 tanks

const schema = new mongoose.Schema({ name: 'string', size: 'string' });
const Tank = mongoose.model('Tank', schema);

(3): 解决(2)中的Modle预设默认行为

  1. 阻止mongoose多元化行为 : mongoose.pluralize(null)

    mongoose 版本>5?

    mongoose.pluralize(null)
    
  2. 基于改变Schema:

    在Scehema中声明collection:

    那么,基于此Schema的Modle的使用会基于collection参数值,

    var schema = new Schema({ name: String }, { collection: 'actor' });
    var M = mongoose.model('Actor', schema);
    // 此时 M 对应数据库中的actor ,而非mongoose预设行为中对应的actors!!
    
    
  3. 基于改变Model:

    var M = mongoose.model('Actor', schema, 'actor');
    // 此时 M 对应数据库中的actor ,而非mongoose预设行为中对应的actors!!
    

2.3.2 完整users.js

const { mongoose } = require('../config/DBHelper')

const Schema = mongoose.Schema;

const UsersSchema = new Schema({
    'name': String,
    'age': Number,
    'gender': String
})

/* 
    默认添加 第1参数复数名称的表;除非指定第3参数:数据库表名
*/
const Users_Model = mongoose.model('user', UsersSchema, 'user');


const add = async (params) => {
    const addResult = await new Users_Model(params).save();
    console.log(addResult, 'Users_Model-addResult')
}


const find = async (params) => {
    const findResult = await Users_Model.find(params);
    console.log(findResult, 'Users_Model-findResult')
}

const updateOne = async (query, data) => {
    const updateOneResult = await Users_Model.updateOne(query, data);
    console.log(updateOneResult, 'Users_Model-updateOneResult')
}

const deleteOne = async (query) => {
    const deleteOneResult = await Users_Model.deleteOne(query);
    console.log(deleteOneResult, 'Users_Model-deleteOneResult')
}



exports.Add_Users = add;

exports.Find_Users = find;

exports.UpdateOne_User = updateOne;

module.exports = {
    DeleteOne_User: deleteOne,
    Add_Users: add,
    Find_Users: find,
    UpdateOne_User: updateOne
}

2.4 对应 Model 操作对应数据库表内容 [ 基于 2.2 , 2.3]

一个 Model 对应数据库一个表;

示例:针对users表使用封装好的方法[users.js]进行操作;

const { Add_Users, Find_Users, UpdateOne_User, DeleteOne_User } = require('./model/users')


Add_Users({
  name: '绿萝南',
  age: 12,
  gender: '男'
})

Find_Users();

UpdateOne_User({ name: 'baidu.com' }, { name: '南南', age: 88 })

DeleteOne_User({name:'绿萝南'})

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

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

相关文章

java计算机毕业设计ssm网络相册设计sepo8(附源码、数据库)

java计算机毕业设计ssm网络相册设计sepo8(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。…

机器学习笔记之受限玻尔兹曼机(四)推断任务——边缘概率

机器学习笔记之受限玻尔兹曼机——推断任务[边缘概率]引言回顾:场景构建推断任务——边缘概率求解边缘概率与Softplus函数引言 上一节介绍了受限玻尔兹曼机中随机变量节点的后验概率,本节将介绍随机变量结点的边缘概率。 回顾:场景构建 已…

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖 Xylan-NH2 木聚糖-氨基 中文名称:木聚糖-氨基 英文名称:Xylan-NH2 别称:氨基修饰木聚糖,氨基-木聚糖 PEG分子量可选:350、550、750、1k、2k、34k、5…

统计学-双变量相关分析-相关系数、相关比、克莱姆相关系数

双变量相关分析根据变量的数据类型不同而不同。当数值数据和数值数据计算相关性时,指标为相关系数;数值数据和类别数据计算相关性时,指标为相关比;类别数据和类别数据计算相关性时,指标为克里姆相关系数。 1 计算公式…

基于现代深度学习的目标检测方法综述

论文地址:A Survey of Modern Deep Learning based Object Detection Models 论文结构: 一、论文亮点(与其他综述不同): 1、深度分析了两类检测方法:单步和两步检测,并从历史的角度分析&…

【covid 时间序列】基于matlab GUI冠状病毒病例、死亡、疫苗接种仿真【含Matlab源码 2262期】

一、⛄SEIR模型简介 1 SEIR模型简介 如果所研究的传染病有一定的潜伏期,与病人接触过的健康人并不马上患病,而是成为病原体的携带者,归入 E 类。此时有: 仍有守恒关系 S(t) E(t) I(t) R(t) 常数,病死者可归入 R…

Vue3 快速入门及巩固基础

1. Vue 框架介绍 2. Vue3 安装方式 3. Vue3 模板语法 4. 组件的 data 属性 5. 计算属性和方法 6. 侦听器的使用 7. class 类名绑定对象 8. class 类名绑定数组 9. style 样式绑定对象 10. style 样式绑定数组 11. 条件渲染 v-if 和 v-show 12. 列表渲染 v-for 13. …

1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯;TPE-MB结构式

中文名称:1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯 中文同义词:1,2-双(4-(溴甲基)苯基)-1,2-二苯乙烯; 分子式:C28H22Br2 分子量:518.28 CAS:1053241-67-0 1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯化学性质 沸点 :533.545.0 C(Predicted) 密度 &#xff…

医依通小程序项目总结

一、项目介绍: 这是一个医疗类的小程序,主要用于新冠疫苗预约,HPV疫苗预约,核酸预约,和咨询等,主要作用就是方便快捷,可以在手机上进行预约挂号,和一些健康自测的功能,还…

MySQL的零拷贝技术

1.需要了解Buffer 与 cache 的区别 Bbuffer 与 Cache 非常类似,因为它们都用于存储数据数据,被应用层读取字节数据。在很多场合它们有着相同的概念: 首先从翻译上,Buffer应该翻译为“缓冲”,Cache应该翻译为“缓存”&#xff0c…

高企技术企业对企业的作用

高新技术企业认定的作用 1、促进企业科技转型 创新是企业发展的根本动力,高新技术企业认定政策是一项引导政策,目的是引导企业调整产业结构,走自主创新、持续创新的发展道路,激发企业自主创新的热情,提高科技创新能力…

堆排序(大根堆与小根堆)

(1)是什么? 是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次…

Cisco ASA应用——NAT的类型

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.NAT的类型 1.动态NAT 2.静态NAT 3.静态PAT 4.动态PAT 前言…

爱奇艺:基于龙蜥与 Koordinator 在离线混部的实践解析

在 2022 云栖大会龙蜥峰会云原生专场上,来自爱奇艺的基础架构研究员赵慰分享了《基于龙蜥与 Koordinator 的在离线混部实践》技术演讲,以下为本次演讲内容: 一、爱奇艺离线业务混部背景 与众多互联网公司一样,爱奇艺常见的负载类…

WSN final fighting 12.05

0.网络时间协议(NTP) p54 1.Min-Max定位 p63 2.质心算法定位 p64 3.覆盖修复过程 p95 4.数据融合的卡尔曼滤波法 p72 5.数据融合的神经网络算法 p73 6.TMAC协议 p135 7.基于分分簇网络的MAC协议 p140 8.蓝牙协议 p170 9.GEM路由协议 p206 10.MECN路由协议 p206 11.阐…

INTERSPEECH 2022——基于层级上下文语义信息的多尺度语音合成风格建模

本文由清华大学与虎牙信息科技有限公司、元象唯思控股(深圳)有限公司和香港中文大学合作。 人类语音的风格表达是多尺度的,不仅包括全局尺度的情感表达,还包括局部尺度的韵律表达。 而现有关于表现力语音合成的工作只考虑了单一尺…

C++ 静态成员变量与静态成员函数

在C的类中&#xff0c;有静态成员变量和静态成员函数 #include <iostream> #include <string>using namespace std;class test { private:static int m_value; //定义类的静态成员变量public:static int getValue() //定义类的静态成员函数{return m_value;} };in…

Mybatis-Plus中的and和or用法

先看Mybatis-Plus官网中对这两个关键字用法的介绍 数据库文件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1KzY32Jq0srDQU9m-a-YtBQ?pwdrsdg 提取码&#xff1a;rsdg 表数据&#xff1a; 比如我们想查age等于23并且school_id等于300的 sql语句为&#xff1a;select…

FL Studio 20音乐制作教程

FL Studio 20音乐制作教程 FL Studio 20 中的音乐制作 – 制作 3 首完整曲目 – 只需一天即可管理 FL Studio&#xff0c;音乐、混音和母带制作 课程英文名&#xff1a;FL Studio 20 Music Production In FL Studio for Mac & PC 此视频教程共20.0小时&#xff0c;中英双…

【C++11多线程】线程的创建、结束、传递参数

文章目录1.普通函数作为线程函数1.1 thread1.2 join()1.3 detach()1.4 joinable()2.函数对象作为线程函数3.lambda表达式作为线程函数4.类成员函数作为线程函数5.向线程函数传递参数1.普通函数作为线程函数 程序运行起来&#xff0c;生成一个进程&#xff0c;其中主线程从 mai…