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 相关文章推荐
Bootstrap组件系列之福利篇几款好用的组件(推荐)
Jun 23 Javascript
jQuery获取同级元素的简单代码
Jul 09 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
Oct 15 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
jQuery基本筛选选择器实例代码
Feb 06 Javascript
node使用UEditor富文本编辑器的方法实例
Jul 11 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 Javascript
vue自动化表单实例分析
May 06 Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
Sep 26 Javascript
antd日期选择器禁止选择当天之前的时间操作
Oct 29 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
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
2016/06/24 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
python控制台显示时钟的示例
2014/02/24 Python
Python中操作MySQL入门实例
2015/02/08 Python
python将ip地址转换成整数的方法
2015/03/17 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
详解python时间模块中的datetime模块
2016/01/13 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
实例讲解Python爬取网页数据
2018/07/08 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
pytorch数据预处理错误的解决
2020/02/20 Python
Android面试宝典
2013/08/06 面试题
银行自荐信范文
2013/10/07 职场文书
护士的岗位职责
2013/12/04 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
2015年健康教育工作总结
2015/04/10 职场文书