Node.js对MongoDB进行增删改查操作的实例代码


Posted in Javascript onApril 18, 2019

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)
}

总结

以上所述是小编给大家介绍的Node.js对MongoDB进行增删改查操作的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
100个不能错过的实用JS自定义函数
Mar 05 Javascript
jQuery Mobile框架中的表单组件基础使用教程
May 17 Javascript
Bootstrap开关(switch)控件学习笔记分享
May 30 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
浅谈通过JS拦截 pushState和replaceState事件
Jul 21 Javascript
原生js封装运动框架的示例讲解
Oct 01 Javascript
javascript中UMD规范的代码推演
Aug 29 Javascript
微信小程序扫描二维码获取信息实例详解
May 07 Javascript
Vue-cli 移动端布局和动画使用详解
Aug 10 Javascript
vue项目开启Gzip压缩和性能优化操作
Oct 26 Javascript
Vue 进阶之路(三)
Apr 18 #Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 #Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 #Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 #Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 #Javascript
vue模式history下在iis中配置流程
Apr 17 #Javascript
详解Vue 全局变量,局部变量
Apr 17 #Javascript
You might like
PHP基础知识介绍
2013/09/17 PHP
浅析PHP文件下载原理
2014/12/25 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Python中下划线的使用方法
2015/03/27 Python
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
python中怎么表示空值
2020/06/19 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
商场消防管理制度
2014/01/12 职场文书
建筑结构施工求职信
2014/07/11 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
婚育证明样本
2015/06/16 职场文书