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 preload&lazy load
May 13 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
Javascript操作URL函数修改版
Nov 07 Javascript
javascript对象的使用和属性操作示例详解
Mar 02 Javascript
js 数组去重的四种实用方法
Sep 09 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
javascript阻止事件冒泡和浏览器的默认行为
Jan 21 Javascript
深入理解 JavaScript 中的 JSON
Apr 06 Javascript
js仿微信公众平台打标签功能
Apr 08 Javascript
vue2.0 自定义日期时间过滤器
Jun 07 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
Nov 09 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
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
使用python实现扫描端口示例
2014/03/29 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
Python实现的简单计算器功能详解
2018/08/25 Python
python的turtle库使用详解
2019/05/10 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
深入了解Django View(视图系统)
2019/07/23 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
小班开学寄语
2014/04/04 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
敬老模范事迹
2014/05/21 职场文书
银行求职自荐书
2014/06/25 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
民事赔偿协议书
2014/11/02 职场文书
个园导游词
2015/02/04 职场文书
总经理检讨书范文
2015/02/16 职场文书
2016秋季运动会前导词
2015/11/25 职场文书