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 相关文章推荐
一些不错的js函数ajax
Aug 20 Javascript
EasyUI中的tree用法介绍
Nov 01 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
Apr 23 Javascript
javascript 数组的定义和数组的长度
Jun 07 Javascript
详解Web使用webpack构建前端项目
Sep 23 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
Jan 23 Javascript
angular 内存溢出的问题解决
Jul 12 Javascript
vue 纯js监听滚动条到底部的实例讲解
Sep 03 Javascript
浅谈webpack+react多页面开发终极架构
Nov 11 Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
详解js实时获取并显示当前时间的方法
May 10 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
农民和部队如何穿矿
2020/03/04 星际争霸
php简单定时执行任务的实现方法
2015/02/23 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
Django 路由控制的实现
2019/07/17 Python
python颜色随机生成器的实例代码
2020/01/10 Python
pandas分批读取大数据集教程
2020/06/06 Python
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
建筑行业的大学生自我评价
2013/12/08 职场文书
管道维修工岗位职责
2013/12/27 职场文书
吨的认识教学反思
2014/04/27 职场文书
高中课程设置方案
2014/05/28 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
2014年导购员工作总结
2014/11/18 职场文书
务虚会发言材料
2014/12/25 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL