Node.js 操作MongoDB (Mongoose) 数据库

news2024/11/15 13:50:08

         在讲Node.js通过使用mongoose模块来操作MongoDB数据库之前首先是关于MongoDB数据库的安装和MongoDB服务以及对MongoDB命令行的操作和可视化工具MongoDBCompass的一个基本使用;那么在这里已经准备好了关于MongoDB数据库的内容了:


MongoDB数据库安装详细 :  MongoDB数据库安装详细教程

MongoDB 数据库命令行操作 :  MongoDB数据库命令行操作

MongoDB 数据库图形化工具操作 :  1. MongoDBCompass   2. Navicat for Premium 16


        mongoose是一个对象模型工具,可以通过它在Node.js异步环境下对MongoDB数据库安装,是MongoDB提供的一个库,可以通过它操作数据库;回顾MySQL数据库是通过引用mysql模块,通过query()方法来执行sql语句操作数据库,话不多说,先来局部安装mongoose模块;

引入模块

1. 使用npm包管理器安装 mongoose

npm install mongoose --save

2. 引入mongoose

const mongoose = require('mongoose');

        在连接数据库之前请确保 MongoDB Server 服务已经启动成功;如果未启动,请通过前面MongoDB 相关的篇目当中查看 :


连接数据库

        连接MongoDB数据库需要知道数据库的一些信息,如在MySQL数据库中需要知道数据库的host,user,password,database 这些参数创建连接对象后通过connect() 方法连接,那么MongoDB中需要知道的是这个三个 :  配置好的URL 、 端口号 、数据库名;然后通过connect() 方法连接;还记得在使用MongoDBCompass图形化工具中要先连接数据库吗?如下:

         通过以上就可以得到MongoDB数据库的配置信息(URL、prot(端口号)、database(数据库))

1. 代码编写:

const mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/syan',function(err){
    if(err){
        console.log("—— 连接异常 ——");
    }else{
        console.log("—— 连接成功 ——");
    }
});

 2. 测试运行:

(node:24680) [MONGOOSE] DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7. Use `mongoose.set('strictQuery', false);` if you want to prepare for this change. Or use `mongoose.set('strictQuery', true);` to suppress this warning.       
(Use `node --trace-deprecation ...` to show where the warning was created)

        显示 "连接成功" 有这一段不推荐这么做的警告⚠,在Mongoose 7中的 "strictQuery" 选项将会变成 "false"," strictQuery" 是什么?看一下原文档:如下就是设置架构的默认严格查询模式,可能是false,true或者throw;

        根据提示的警告,如果你不想看到此警告,可以这样来添加代码设置一下:

mongoose.set('strictQuery', true);

3. 调试测试运行:


Schema 

         MongoDB 只有集合和文档,并不像MySQL中有表结构,在MongoDB数据库中的每一条文档可以是完全不一样的数据结构,那么就需要一个规范 —— Schema,Schema只是规范存放文档数据类型并没有操作数据库的能力;Schema支持的数据类型有String 、Number、Date、Buffer、Boolean、Array、ObjectId和Mixed;

规范编写:

// 构造函数 new mongoose.Schema
const docSchema = new mongoose.Schema({
    Name : String,
    Age : Number,
    Sex : String,
    cardId : Number
});

        Schema仅定义了文档的框架,让每一个Schema都与MongoDB数据库中的集合对应,Schema和Model是定义和生成collection(集合) 和 document(文档) 过程的工具;Model是什么呢?

Model

        Schema编译而成的构造器是Model,包含抽象属性和行为,每一个实例化后的Model实际上是一个文档,可以实现对数据库的操作;通过 model() 方法创建Model时,格式如下:

mongoose.model(参数1,参数2,参数3);
参数1 : modelName —— 映射数据库中的集合名;
参数2 : Schema —— 创建Schema的对象名;
参数3 : 可选,代表数据库集合名;设置了会与第三参数的集合建立连接操作该集合,反之则会与(参数1 + s )建立连接;
mongoose.model("sen",senSchema);          // 连接的是 <sens集合>
mongoose.model("sen",senSchema,"lin");    // 连接的是 <lin集合>

 注: 在操作文档使用一些方法进行增删查改的时候,需要注意一些Api是否已经被弃用了,在使用的时候报错会有提醒API是否已被弃用;

 操作文档

        可以通过Schema来创建Model对应数据库中的collection,通过Model对MongoDB数据库进行操作:

        下面来对syan数据库下的sen集合中添加一条文档内容;先来通过CMD命令或者MongoDB查看syan数据库中的sen集合中由几条文档内容;

        有两条数据内容,下面通过编写代码来往数据库中添加一条文档:

const mongoose = require('mongoose');
mongoose.set('strictQuery', true);
mongoose.connect('mongodb://127.0.0.1:27017/syan',function(err){
    if(err){
        console.log("—— 连接异常 ——");
    }else{
        console.log("—— 连接成功 ——");
    }
});

// 增

// 数据类型
const insertSchema = new mongoose.Schema({
    name:String,
    age:Number
});

// Model
const insertModel = mongoose.model("syan",insertSchema,"sen");

// 添加数据内容 —— <name> : 'LIN',<age> : 18
let addContent = {
    name:'LIN',
    age:18
}

insertModel.insertMany(addContent,function(err){    
    if(err){
        console.log("!! 添加失败 !!");
    }else{
        console.log("++ 添加成功 ++");
    }
});

通过图形化工具查询一下sen集合中的文档内容:(多添加了一条内容);

 查

        下面来查询一下sen集合中的一条name字段为 "YAN" 和age字段为 "18"的文档信息;

1. 代码编写 (代码都重新编写,以此来记忆)

... 连接 ...
// 查

// 数据类型
const checkSchema = new mongoose.Schema({
    name:String,
    age:Number
});

// Model
const checkModel = mongoose.model("syan",checkSchema,"sen");

// 查询数据 —— <name>: 'YAN'
let findContent = {
    name:'YAN',
    age:18
}

checkModel.find(findContent,function(err,data){
    if(err){
        console.log("!!查询失败!!");
    }else{
        console.log("—— 查询成功 ——");
        console.log(data);
    }
});

2. 测试运行

 改

        下面继续来修改sen集合中的一条字段name名为"LIN"的文档信息修改为 <name> : "ZEN",<age> : "18".

1 . 代码编写

... 连接 ...
// 改

// 数据类型
const updateSchema = new mongoose.Schema({
    name:String,
    age:Number
}) 

// Model 
const updateModel = mongoose.model("syan",updateSchema,"sen");

// 修改的条件
const querys = {
    name:'LIN',
    age:18
}

// 修改的内容
const updateContent = {
    name:'ZEN',
    age:18
}

updateModel.updateOne(querys,{$set:updateContent},function(err){
    if(err){
        console.log("!!修改失败!!");
    }else{
        console.log("** 修改成功 **")
    }
});

2. 测试运行 

        下面来删除sen集合中的一条文档记录,<name> : "ZEN",<age> : "18";

1. 代码编写

// 删

// 数据类型
const delSchema = new mongoose.Schema({
    name:String,
    age:Number
})

// Model
const delModel = mongoose.model("syan",delSchema,"sen");

// 删除的内容
const delContent = {
    name:'ZEN',
    age:18
}

// 有些api已经被弃用了,如remove
delModel.deleteMany(delContent,function(err){
    if(err){
        console.log("!!删除失败!!")
    }else{
        console.log("-- 删除成功 --")
    }
});

2. 测试运行

        以上就是在 Node.js 中使用mongoose来操作MongoDB数据库对集合中的文档进行增删查改操作;那么本篇目就到此结束,在下一篇中在Express框架中完成MongoDB数据库的连接以及增删改查的操作,感谢大家的支持!

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

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

相关文章

学习shell与shell编程

Linux配置文件都是以ASCII的纯文本形式存在。 为什么学习vi 1)UnixLike系统都会内置vi文本编辑器&#xff0c;其他的文本编辑器则不一定存在 2)许多软件的编辑接口都会主动调用vi 3)vi具有程序编辑的能力&#xff0c;可以主动以字体颜色辨别语法的正确性 4)程序简单&#…

06-jquery函数

2.6函数 .6.1第一组函数 1 val():操作dom函数的value值 val()&#xff1a;没有参数&#xff0c;获取dom数组中第一个dom对象的value值。 val(参数)&#xff1a;有参数&#xff0c;给dom数组中所有dom对象的value属性赋值。 2 text()&#xff1a;操作标签文本内容&#xff0c;…

springCloud集成elk+filebeat+kafka+zipkin实现多个服务日志链路追踪聚合到es

一、目的 如今2023了&#xff0c;大多数javaweb架构都是springboot微服务&#xff0c;一个前端功能请求后台可能是多个不同的服务共同协做完成的。例如用户下单功能&#xff0c;js转发到后台网关gateway服务&#xff0c;然后到鉴权spring-sercurity服务&#xff0c;然后到业务…

【实操案例十一】使用try-except手动捕获异常 实例代码及运行效果图!

任务一&#xff1a; 编写程序输入学员成绩 异常捕获忘了的同学&#xff0c;可以参考这个&#xff1a;Bug的常见类型及异常处理机制 # 任务一&#xff1a; 编写程序输入学员成绩iint(input(请输入学员成绩&#xff1a;)) if 0<i<100:print(i) else:raise Exception(分数…

产品设计-基础控件-信息输入控件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 产品设计-基础控件-信息输入控件1.1.文本框一、1.1.11.1.2、占位符文本1.1.3 输入框1.1.4 帮助文本1.1.5 初始默认值1.1.6 输入文本1.1.7 跟踪图标1.1.8 格式化标记1.2 单选按…

java枚举类2023028

一个类的对象是有限而且固定的&#xff0c;比如季节类&#xff0c; 它只有4个对象&#xff1b;再比如行星类&#xff0c;目前只有8个对象。这种实例有限而且固定的类&#xff0c;在Java里被称为枚举类。在早期代码中&#xff0c;可能会直接使用简单的静态常量来表示枚&#xff…

设计模式 - 六大设计原则之OCP(开闭原则)

文章目录概述Case接口定义接口实现Bad ImplBetter Impl概述 Open-Close Principle 在面向对象编程领域中&#xff0c;开闭原则规定软件中的类、对象、模块和函数对扩展应该是开放的&#xff0c;但对修改是封闭的。 这意味着 应该用抽象定义结构&#xff0c;用具体实现扩展细节…

使用 AJAX+JSON 实现用户查询/添加功能

实现用户查询/添加功能1. 查询功能准备selectAllServlet&#xff1a;brand.html&#xff1a;2. 添加功能addBrand.html&#xff1a;表单&#xff1a;<script&#xff1a;addServlet&#xff1a;1. 查询功能 需求&#xff1a;在onload&#xff08;页面加载完成&#xff09;事…

SSM项目实战【从 0 到 1】:个人博客

文章目录前言一、项目简介二、项目技术栈三、准备工作1、Spring Boot 项目创建2、mybatis 配置3、数据库创建四、基本框架搭建1、实体层&#xff08;model&#xff09;2、控制器层&#xff08;controller&#xff09;3、服务层&#xff08;service&#xff09;4、持久层&#x…

Liunx相关服务无法启动,带你一步一步找出问题和解决问题

liunx服务无法开启的原因有各种各样&#xff0c;首先我们需要找到我们究竟是为什么不能能够开启这个服务&#xff0c;这里我们先要去考虑到的一个非常重要的问题就是我们的防火墙有没有启动&#xff0c;防火墙有没有把我们的要开启相关服务的端口给封禁掉。这个是无论如何都要第…

学习记录668@项目管理之项目沟通管理和干系人管理

书上这部分的内容很无趣、很花里花哨、很杂乱&#xff0c;所以本文只摘取我认为比较有用和有意义的片段。 沟通方式 在发送方自认为已经掌握了足够的信息&#xff0c;有了自己的想法且不需要进一步听取多方意见时&#xff0c;往往选择控制力极强、参与程度最弱的“叙述方式”&a…

ES学习看这一篇文章就够了

第一章 ES简介 第1节 ES介绍 1 2 3 41、Elasticsearch是一个基于Lucene的搜索服务器 2、提供了一个分布式的全文搜索引擎,基于restful web接口 3、Elasticsearch是用Java语言开发的&#xff0c;基于Apache协议的开源项目&#xff0c;是目前最受欢迎的企业搜索引擎 4、Elastics…

机器学习(四):机器学习工作流程

文章目录 机器学习工作流程 一、什么是机器学习 二、机器学习工作流程 1、获取到的数据集介绍 2、数据基本处理 3、特征工程 4、机器学习 5、模型评估 机器学习工作流程 一、什么是机器学习 机器学习是从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行…

【程序环境和程序预处理】万字详文,忘记了,看这篇就对了

本章介绍一个test.c文件是如何生成一个test.exe文件。首先了解程序环境和程序预处理的大致流程&#xff0c;本章会分别介绍各个流程&#xff0c;但重点是翻译中的编译中的预编译阶段。 文章目录&#xff1a; 1.程序翻译环境和运行环境 1.1程序翻译中的的编译和链接 2.预编译…

Flowable进阶学习(四)任务分配与流程变量

文章目录一、任务分配1. 固定分配2. 表达式分配值表达式&#xff1a;Value expression方法表达式&#xff1a;Method expression3. 监听器分配二、流程变量1. 全局变量2. 局部变量案例&#xff1a;一、任务分配 1. 固定分配 在绘制流程图时或在流程文件中通过Assignee来指定的…

3.2 特征图尺寸计算与参数共享|池化层的作用|整体网络架构|VGG网络架构|残差网络Resnet|感受野的作用

文章目录特征图尺寸计算与参数共享池化层的作用整体网络架构VGG网络架构&#xff08;了解向&#xff0c;背景向&#xff09;残差网络Resnet&#xff08;了解向&#xff0c;背景向&#xff09;感受野的作用特征图尺寸计算与参数共享 给个例子&#xff1a; 如果输入的数据是32323…

GDB的常用命令

GDB是一个调试程序&#xff0c;可以用来调试C/C程序。这个C/C要产生符号表才能使用GDB调用。例如C&#xff1a; g -g source.cppGDB常用命令 首先要生成一个有调试符号的ELF文件&#xff08;exe curable and linkable format),简单点说就是一个带调试符号可执行文件。加-g参数…

client-go实战之八:更新资源时的冲突错误处理

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…

matlab控制理论学习

一、求传递函数表达式residue() 1、极点不同的情况 分子和分母的矩阵分别为&#xff1a; >> num[2 5 3 6]; >> den[1 6 11 6]; 使用下列命令&#xff0c;即可对分式进行展开&#xff0c;展开后有多项&#xff0c;每一项的分子一定是数字&#xff0c;而分母则是一个…

mysql底层解析——连接层,包括连接、解析、缓存、引擎、存储等

1、 前言 打算写一个系列的文章&#xff0c;主要是mysql底层解析。 很多时候&#xff0c;程序员对mysql处于频繁使用&#xff0c;但都一知半解的程度&#xff0c;除了会加个索引&#xff0c;貌似也没啥优化的技能了。事实上&#xff0c;mysql能有今日的成就&#xff0c;必然不…