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面向对象之静态与非静态类
Feb 03 Javascript
jquery 日期分离成年月日的代码
May 14 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
Mar 25 Javascript
Express作者TJ告别Node.js奔向Go
Jul 14 Javascript
javascript验证身份证号
Mar 03 Javascript
iframe跨域通信封装详解
Aug 11 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
May 30 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
JavaScript生成一个不重复的ID的方法示例
Sep 16 Javascript
小程序实现背景音乐播放和暂停
Jun 19 Javascript
React中的Context应用场景分析
Jun 11 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
详解python 中in 的 用法
2019/12/12 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
毕业生简单求职信
2013/11/19 职场文书
超市营业员岗位职责
2013/12/20 职场文书
应用数学专业求职信
2014/03/14 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
授权委托书格式
2014/07/31 职场文书
委托书的写法
2014/08/30 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
新手初学Java List 接口
2021/07/07 Java/Android