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 相关文章推荐
基于jQuery的自动完成插件
Feb 03 Javascript
详谈javascript中的cookie
Jun 03 Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
通过javascript实现扫雷游戏代码实例
Feb 09 Javascript
JS实现页面数据懒加载
Feb 13 Javascript
vue父子模板传值问题解决方法案例分析
Feb 26 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 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 ss7.5的数据调用 (笔记)
2010/03/08 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
PHP 图片处理
2020/09/16 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
python实现多线程网页下载器
2018/04/15 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python实现一个论文下载器的过程
2021/01/18 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
护理工作感言
2014/01/16 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书