Node.js对MongoDB进行增删改查操作

MongoDB简介

MongoDB是一个开源的、文档型的NoSQL数据库程序。MongoDB将数据存储在类似JSON的文档中,操作起来更灵活方便。NoSQL数据库中的文档(documents)对应于SQL数据库中的一行。将一组文档组合在一起称为集合(collections),它大致相当于关系数据库中的表。

除了作为一个NoSQL数据库,MongoDB还有一些自己的特性:

  • 易于安装和设置
  • 使用BSON(类似于JSON的格式)来存储数据
  • 将文档对象映射到应用程序代码很容易
  • 具有高度可伸缩性和可用性,并支持开箱即用,无需事先定义结构
  • 支持MapReduce操作,将大量数据压缩为有用的聚合结果
  • 免费且开源
  • ......

连接MongoDB

在Node.js中,通常使用Mongoose库对MongoDB进行操作。Mongoose是一个MongoDB对象建模工具,设计用于在异步环境中工作。

const mongoose = require('mongoose');mongoose.connect('mongodb://localhost/playground').then(() => console.log('Connected to MongoDB...')).catch( err => console.error('Could not connect to MongoDB... ', err));

Schema

Mongoose中的一切都始于一个模式。每个模式都映射到一个MongoDB集合,并定义该集合中文档的形状。
Schema类型

const courseSchema = new mongoose.Schema({name: String,author: String,tags: [String],date: {type: Date, default: Date.now},isPublished: Boolean
});

Model

模型是根据模式定义编译的构造函数,模型的实例称为文档,模型负责从底层MongoDB数据库创建和读取文档。

const Course = mongoose.model('Course', courseSchema);
const course = new Course({name: 'Nodejs Course',author: 'Hiram',tags: ['node', 'backend'],isPublished: true
});

新增(保存)一个文档

async function createCourse(){const course = new Course({name: 'Nodejs Course',author: 'Hiram',tags: ['node', 'backend'],isPublished: true});const result = await course.save();console.log(result);
}createCourse();

查找文档

async function getCourses(){const courses = await Course.find({author: 'Hiram', isPublished: true}).limit(10).sort({name: 1}).select({name: 1, tags:1});console.log(courses);
}
getCourses();

使用比较操作符

比较操作符

async function getCourses(){const courses = await Course// .find({author: 'Hiram', isPublished: true})// .find({ price: {$gt: 10, $lte: 20} }).find({price: {$in: [10, 15, 20]} }).limit(10).sort({name: 1}).select({name: 1, tags:1});console.log(courses);
}
getCourses();

使用逻辑操作符

  • or (或) 只要满足任意条件
  • and (与) 所有条件均需满足
async function getCourses(){const courses = await Course// .find({author: 'Hiram', isPublished: true}).find()// .or([{author: 'Hiram'}, {isPublished: true}]).and([{author: 'Hiram', isPublished: true}]).limit(10).sort({name: 1}).select({name: 1, tags:1});console.log(courses);
}
getCourses();

使用正则表达式

async function getCourses(){const courses = await Course// .find({author: 'Hiram', isPublished: true})//author字段以“Hiram”开头// .find({author: /^Hiram/})//author字段以“Pierce”结尾// .find({author: /Pierce$/i })//author字段包含“Hiram”.find({author: /.*Hiram.*/i }).limit(10).sort({name: 1}).select({name: 1, tags:1});console.log(courses);
}
getCourses();

使用count()计数

async function getCourses(){const courses = await Course.find({author: 'Hiram', isPublished: true}).count();console.log(courses);
}
getCourses();

使用分页技术

通过结合使用 skip()limit() 可以做到分页查询的效果

async function getCourses(){const pageNumber = 2;const pageSize = 10;const courses = await Course.find({author: 'Hiram', isPublished: true}).skip((pageNumber - 1) * pageSize).limit(pageSize).sort({name: 1}).select({name: 1, tags: 1});console.log(courses);
}
getCourses();

更新文档

先查找后更新

async function updateCourse(id){const course = await Course.findById(id);if(!course) return;course.isPublished = true;course.author = 'Another Author';const result = await course.save();console.log(result);
}

直接更新

async function updateCourse(id){const course = await Course.findByIdAndUpdate(id, {$set: {author: 'Jack',isPublished: false}}, {new: true}); //true返回修改后的文档,false返回修改前的文档console.log(course);
}

MongoDB更新操作符,请参考:https://docs.mongodb.com/manual/reference/operator/update/

删除文档

  • deleteOne 删除一个
  • deleteMany 删除多个
  • findByIdAndRemove 根据ObjectID删除指定文档
async function removeCourse(id){// const result = await Course.deleteMany({ _id: id});const course = await Course.findByIdAndRemove(id);console.log(course)
}

转载于:https://www.cnblogs.com/hiramP/p/10724945.html

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

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

相关文章

【操作系统复习】操作系统的发展与分类

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 操作系统的发展与分类一、手工操作阶段二、批处理阶段 —— 单道批处理系统三、批处理阶段 —— 多道批处理系统四、分时操作系统五、实时操作系统六、其他操作系统一、手工操作阶段 过程&#xf…

诺奖得主本庶佑:CNS这些顶刊观点有九成不正确,不要盲从迷信,搞科研做到六个C更重要...

来源:科研大匠整理翻译:思庐哲学诺奖可说是国人心中一直的痛。目前,在诺贝尔奖获奖国家中,美国堪称当之无愧的领头羊。截止发文,美国人已经获得了384枚诺贝尔奖!因此,近代以来,我们一…

【操作系统复习】操作系统的运行机制与体系结构

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 操作系统的运行机制与体系结构一、两种指令、两种处理器状态、两种程序二、操作系统的内核三、操作系统的体系结构一、两种指令、两种处理器状态、两种程序 💁 ” 指令 ” 就是处理器&…

常见面试题

python题 1.类方法(classmethod):1.在python中.类方法 classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是…

详解2021诺贝尔物理学奖:他们破译了地球气候及其他复杂系统的隐秘规律

来源:环球科学封面图来源:cjdrexel, CC PDM 1.010 月 5 日北京时间 17 时 45 分许,2021 年诺贝尔物理学奖被授予“对我们理解复杂系统的开创性贡献”,一半授予真锅淑郎(Syukuro Manabe)和克劳斯哈塞尔曼&am…

LeetCode 670 最大交换 (暴力+贪心、Python)

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-swap 问题描述 给定一个非负整数,你至多可以交换一次数字中的任…

shark恒破解笔记3-EAX决定胜负

PEID查壳 od载入 输入假的注册码 查找出错字符串 往上查找是否有关键跳转和关键call 可以看到此处有个je跳转 实现了跳转,并且跳过了我们注册成功的地址 网上查找这个跳转的关键call,这个call很有可能就是判断一系列注册码是否正确然后返回一个代表是否注…

中国智能建造关键领域技术发展的战略思考!

来源:我国智能建造关键领域技术发展的战略思考[J].中国工程科学,2021,23(4):64-70.作者:陈珂,丁烈云 中国工程院丁烈云院士科研团队在中国工程院院刊《中国工程科学》2021年第4期撰文,阐述了智能建造的基本概念与重要性&#xff0…

Java常用的一些容器

转自:https://www.cnblogs.com/LipeiNet/p/5888513.html 前言:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点,以便我们能更好的使用集合。下面我用一幅图来表示 其中淡绿色…

牛客 21302 被3整除的子序列 (动态规划、Python)

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 524288K,其他语言1048576K 64bit IO Format: %lld 链接:https://ac.nowcoder.com/acm/prob…

图灵奖得主杨立昆:AI+时代,未来将会如何被改变

来源:杨立昆《科学之路:人,机器与未来》编辑:蒲蒲人工智能(AI)近年来的发展可以说包罗万象,几乎涵盖了所有与机器智能化相关的内容。无论是机器人、冰箱、汽车还是软件应用,只要你想…

信号的互相关函数由傅里叶变换形式表达以及推导

互相关函数的信号傅里叶变换形式表达以及推导 1.我们要实现怎样的目标? 如果有两个复信号, 连续信号表示为y1(t)y_1(t)y1​(t)和 y2(t)y_2(t)y2​(t); 离散信号表示为y1(n)y_1(n)y1​(n)和y2(n)y_2(n)y2​(n); 两个信号的互相关函数表示为R…

类与对象和对应方法、封装

1转载于:https://www.cnblogs.com/SlookUp/p/10729454.html

牛客 13822 Keep In Line(枚举与暴力、Python)

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 链接:https://ac.nowcoder.com/acm/problem/13822 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语…

基于IMAGE法的房间回响模型创建、C++代码实现、matlab仿真

基于IMAGE法的房间回响模型创建、C代码实现、matlab仿真1.模型简介 \qquad在处理声音信号时,我们要对信号先进行采集。那么我们就必须要有,一个发出声音的声源,一个进行声音采集的传感器。并且这两者一般都位于房间之中,处于房间内…

花落有机化学!诺贝尔化学奖不再是“理综奖”

来源:学术头条北京时间 2021 年 10 月 6 日下午 5 点 50 分,2021 年诺贝尔化学奖重磅公布,德国马普煤炭研究所所长 Benjamin List、普林斯顿大学化学教授 David W.C. MacMillan 获奖,以表彰他们对“不对称有机催化做出的贡献”。关…

关于Oracle与MySQL的使用总结

平时使用的比较多的数据库管理系统就是Oracle和MySQL,我在这里记录下使用过程中的遇到的问题以及解决方案,以备不时之需 Oracle 关于表空间 Oracle创建数据的代价还是比较大的,所以使用表空间的概念,每个表空间相互独立。这里记录…

牛客 16499 解方程 (数学、Python)

同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 链接:https://ac.nowcoder.com/acm/problem/16499 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 131072K,其他语…

美军认知技术发展态势

来源:人机与认知实验室摘要:美军正在大力发展人工智能中的认知技术,认知技术的进步将极大的促进人机融合智能的发展。首先,综述了美军认知技术的发展历史,从自然语言处理、环境感知、机器人自主控制、自主编组协调、人…

数据结构——单链表的C++实现

数据结构——单链表的C实现\qquad单链表的创建、求长度、查找、插入和删除的C实现。 #include<iostream> using namespace std;//1.定义 typedef struct Node* List; struct Node {int num;Node* next; }; void input(int* a) {cin >> *a; }//2.创建链表 void Cre…