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 相关文章推荐
javascript 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
jQuery html()等方法介绍
Nov 18 Javascript
jQuery 选择器理解
Mar 16 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
May 21 Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
window.open()实现post传递参数
Mar 12 Javascript
EasyUI Combobox设置默认值 获取text的方法
Nov 28 Javascript
原生js实现键盘控制div移动且解决停顿问题
Dec 05 Javascript
JavaScript手风琴页面制作
May 17 Javascript
傻瓜式vuex语法糖kiss-vuex整理
Dec 21 Javascript
js实现视图和数据双向绑定的方法分析
Feb 05 Javascript
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
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,ajax实现分页
2008/03/27 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
python右对齐的实例方法
2020/07/05 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
工地资料员岗位职责
2013/12/31 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
python实现层次聚类的方法
2021/11/01 Python
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电