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之一
Apr 27 Javascript
非常漂亮的JS代码经典广告
Oct 21 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
javascript动态控制服务器控件实例
Sep 05 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
js实现防止被iframe的方法
Jul 03 Javascript
JavaScript严格模式详解
Jan 16 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
详解JavaScript中操作符和表达式
Sep 12 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 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php 高性能书写
2010/12/11 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
PHP制作万年历
2015/01/07 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python采集微信公众号文章
2018/12/20 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
一组SQL面试题
2016/02/15 面试题
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
企业内控岗位的职责
2014/02/07 职场文书
新年爱情寄语
2014/04/08 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
2015年纪委工作总结
2015/05/13 职场文书