node.js操做数据库之MongoDB+mongoose篇

前言

node.js 的出现,使得用前端语法(javascript)开发后台服务成为可能,愈来愈多的前端所以所以接触后端,甚至转向全栈发展。后端开发少不了数据库的操做。MongoDB 是一个基于分布式文件存储的开源数据库系统。本文为你们详细介绍了如何用 node.js + mongoose 玩转 MongoDB 。但愿能帮到有须要的人。javascript

因为我用Mac开发,如下全部操做都是在Mac下进行。html

1、 环境搭建

安装Node.js

有 node 环境的能够跳过。前端

nodejs官网提供了 macOS 安装包,直接下载安装便可。如今 nodejs 稳定版已经到了 12.11.1java

安装MongoDB

MongoDB 是为现代应用程序开发人员和云时代构建的基于文档的通用分布式数据库。node

上个月(9月) macOS 包管理器 Homebrew 宣布移除 MongoDB 。缘由是去年10月 MongoDB 宣布将其开源许可证从 GNU AGPLv3 切换到 SSPL(Server Side Public License),以此回应 AWS 等云厂商将 MongoDB 以服务的形式提供给用户而没有回馈社区的行为,MongoDB 但愿从软件即服务上获取收入。Homebrew 认为 MongoDB 已经再也不属于开源范畴...git

言归正传,因为上述缘由,咱们不能直接使用 brew install mongodb 来安装 MongoDB 了。好在 MongoDB 本身维护了一个定制化的 Homebrew tap。并在 Install MongoDB Community Edition 更新了安装步骤。github

Mac下 MongoDB 的最新安装步骤以下:mongodb

1. 首先安装 Homebrew

Homebrew 是 macOS 的包管理器。由于 OSX 默认不包含 Homebrew brew 包,因此要先安装,已经安装过的能够跳过。数据库

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码

安装过程会有点长,终端输出信息超过一屏,这里我只截取了头尾两部分。 npm

mg-install-homebrew.jpg

mg-install-homebrew-2.jpg

2. 而后获取下 MongoDB Homebrew Tap

brew tap mongodb/brew
复制代码

mg-tap-mongodb-brew.jpg

3. 最后安装 MongoDB CE(社区版)

brew install mongodb-community@4.2
复制代码

mg-brew-install-mongodb.jpg

如今你的 Mac 上就已经安装好 MongoDB 环境了。

安装mongoose

node.js 是能够直接操做 MongoDB 的,可是经过 MongoDB 命令语法直接编写 MongoDB 验证、数据类型转换和业务逻辑模版比较繁琐。因此咱们使用了 mongoose。

mongoose 是 MongoDB 的一个对象模型工具,它对 MongoDB 的经常使用方法进行了封装,让 node.js 操做 MongoDB 更加优雅简洁。

刚才的 node.js 和 MongoDB 都是安装在全局环境,mongoose 则是安装在你的项目下:

cd your-project
npm i -S mongoose
复制代码

mg-install-mongoose.jpg

如今,你的开发环境就已经所有安装好了。

2、启动MongoDB服务

要操做 MongoDB ,首先要启动它。 有两种方式启动 MongoDB 服务:

1. 在前台运行

mongod --config /usr/local/etc/mongod.conf
复制代码

前台运行的好处就是,能够查看一些反馈和日志,便于调试。另外若是要关闭服务,只须要在终端按 control + c 键便可。

mg-run-mongodb-in-foreground.jpg

2. 也能够做为 macOS 服务,在后台运行

brew services start mongodb-community@4.2
复制代码

好处是开机就自动启动,随时可使用。

mg-run-mongodb-as-a-server.jpg
这种启动方式,若是要关闭服务,能够经过 stop 命令:

brew services stop mongodb-community@4.2
复制代码

mg-stop-mongodb-service.jpg

如今,你的 MongoDB 数据库已经开启了。

3、操做MongoDB

操做以前先解释一下MongoDB和mongoose里的一些核心概念。

MongoDB

  • MongoDB 中的数据记录是一种 BSON 格式的文件(BSON是一种用二进制描述的JSON文件格式)。
  • MongoDB 将文件存储在集合中,将集合存储在数据库中。
  • MongoDB 的数据库、集合都不用手动建立。
  • 集合collection: 至关于关系型数据库中的表table
  • 文件document: MongoDB 的数据记录单位,至关于关系型数据库中的记录row

mongoose

  • schema: 在 mongoose 中,全部的东西都来源于一个 schema,每一个schema 映射了一个 MongoDB 的集合,它定义了这个集合中的文档的骨架。
  • model: 一个文件的构造器,经过编译schema获得,一个model的实例就是一个文件model负责从 MongoDB 数据库中建立和读取文档

更多mongoose概念能够在mongoose guide中查阅。

数据库操做:

1. 使用 mongoose 链接 MongoDB

在项目中建立 connection.js 文件

// connection.js file
const mongoose = require('mongoose');
const conn = mongoose.createConnection(

  // 链接地址,MongoDB 的服务端口为27017
  // dbtest是我要使用的数据库名,当往其中写数据时,MongoDB 会自动建立一个名为dbtest的数据库,不用事先手动建立。
  'mongodb://127.0.0.1:27017/dbtest', 

  // 一些兼容配置,必须加,你不写运行的时候会提示你加。
  {
    useNewUrlParser: true,
    useUnifiedTopology: true
   }
)
conn.on('open', () => {
	console.log('打开 mongodb 链接');
})
conn.on('err', (err) => {
	console.log('err:' + err);
})
复制代码

运行:

node conection.js
复制代码

mg-connection.jpg

能够看到打印出“打开 mongodb 链接”,而且运行一直在等待。

这说明如今已经成功链接上 MongoDB 了,接下来能够开始操做数据库了。

为了方便扩展起见,咱们先对 connection.js 改造一下,让它做为模块导出,这样就能够在其余地方导入复用了。

// connection.js file
const mongoose = require('mongoose');
const conn = mongoose.createConnection(
  'mongodb://127.0.0.1:27017/dbtest',
  {
    useNewUrlParser: true,
    useUnifiedTopology: true
   }
)
conn.on('open', () => {
	console.log('打开 mongodb 链接');
})
conn.on('err', (err) => {
	console.log('err:' + err);
})

module.exports = conn; //commonJs 语法,导出conn模块。
复制代码

2. 添加操做

save | create 方法

新建insert.js文件

// insert.js file
let mongoose = require('mongoose');

// 导入链接模块
let connection = require('./connection');

// 建立schema
let StudentSchema = new mongoose.Schema({
   name: String,
   age: Number
})

// 经过connection和schema建立model
let StudentModel = connection.model('Student', StudentSchema);


// 经过实例化model建立文档
let studentDoc = new StudentModel({
    name: 'zhangsan',
    age: 20
})

// 将文档插入到数据库,save方法返回一个Promise对象。
studentDoc.save().then((doc) => {
    console.log(doc)
})
复制代码

运行:

node insert.js
复制代码

为了更直观看到操做数据库的结果,推荐你们安装一个数据库可视化工具:Robo3T,下载mac版安装便可。

mg-robo3T-download2.jpg

点击 Robo3T 左上角链接咱们的数据库后,能够看到 MongoDB 自动帮咱们生成了数据库和集合,而且已经插入了一条记录:

mg-insert.jpg

或者还能够直接经过Model的create方法直接插入数据,返回的也是一个Promise:

StudentModel.create({
    name: 'lisi',
    age: 19
}).then((doc) => {
    console.log(doc)
})
复制代码

3. 读取操做

find 方法

为更加合理复用代码,咱们先把 StudentSchema 和 StudentModel 抽离出来:

新建StudentSchema.js文件

// StudentSchema.js file
const mongoose = require('mongoose');

let StudentSchema = mongoose.Schema({
    name: String,
    age: Number
})

module.exports = StudentSchema;
复制代码

新建StudentModel.js文件

// StudentModel.js file
const connection = require('./connection');
const StudentSchema = require('./StudentSchema');

let StudentModel = connection.model('Student', StudentSchema);

module.exports = StudentModel;
复制代码

而后新建query.js文件

// query.js file
const StudentModel = require('./StudentModel');

// 富查询条件,对象格式,键值对,下面为查询 name 为 lisi 的记录
StudentModel.find({name: 'lisi'}).then(doc => {
    console.log(doc);
})
复制代码

运行

node query.js
复制代码

mg-guery.jpg

能够看到namelisi的记录被打印了出来。

若是想查询整个集合:

// 不放查询条件即查询全部的记录
StudentModel.find({}).then(doc => {
    console.log(doc);
})
复制代码

mg-guery-all.jpg

能够看到集合中的全部记录被打印了出来。

4. 更新操做

update|updateOne|updateMany方法

新建update.js文件

// update.js file
const StudentModel = require('./StudentModel');

// update 方法接收2个参数,第一个是查询条件,第二个是修改的值
// 下面把name为lisi的记录,将他的age修改成80
StudentModel.update({name: 'lisi'}, {age: 80}).then(result => {
    console.log(result)
})
复制代码

进入 Robo3T,能够看到数据被更改,切换到表格模式更加直观:

mg-update2.jpg

不过在终端,提示DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.

mg-update.jpg

意思是建议咱们使用 updateOneupdateMany或者bulkWrite

update 更新查询到的全部结果,方法已经不提倡使用,已被updateMany替代。 updateOne 若是查询到多条结果,只更新第一条记录。 upateMany 更新查询到的全部结果。 bulkWrite 提供可控执行顺序的批量写操做。

为了代码的健壮性,咱们应该根据建议将update方法换成updateMany方法。

另外,终端的输出{ n: 1, nModified: 1, ok: 1 }的意思是:

  • “n: 1”:查询到1条记录。
  • “nModified: 1”:须要修改1条记录。(若是修改值和原始值相同,则须要修改的就是0条)
  • “ok: 1”:修改为功1条。

5. 删除操做

remove|removeOne|removeMany|bulkWrite方法

新建remote.js文件

// remove.js file
const StudentModel = require('./StudentModel');

// delete 方法接收1个参数,就是查询条件
// 下面把name为lisi的记录删除
StudentModel.remove({name:'lisi'}).then((result) => {
    console.log(result);
});
复制代码

进入 Robo3T,能够看到集合里已经没有name为lisi的记录了:

mg-remove2.jpg

在看终端的输出,跟update相似,也提示建议使用新的方法代替。

mg-remove.jpg

意思是建议咱们使用 removeOneremoveMany或者bulkWrite

remove 删除查询到全部结果,方法已经不提倡使用,已被removeMany替代。 removeOne 若是查询到多条结果,只删除第一条记录。 removeMany 删除查询到全部结果。 bulkWrite 提供可控执行顺序的批量写操做。

另外,终端的输出{ n: 1, ok: 1, deletedCount: 1 }的意思跟update的相似,就不累述了。

如今咱们已经成功地对 MongoDB 数据库进行了 CRUD(添加、读取、更新、删除)操做。欢呼~

更多高级操做,能够到mongoose API 文档中查阅。

4、总结

梳理一下,主要讲了这些内容:

  1. node.js+MongoDB+mongoose 在Mac下的环境搭建,注意使用最新的 MongoDB 的安装方式。
  2. 在Mac下如何启动和关闭 MongoDB 服务。
  3. 介绍了 MongoDBmongoose 的基本核心概念。
  4. 使用 mongoose 链接以及增删改查 MongoDB 操做。可使用 Robo3T 来更直观地观察数据库。

前端也能玩转数据库开发。 欢迎交流~

文章源码地址:github.com/yc111/mongo…

相关网站:
Homebrew官网
MongoDB官网
monggose官网
Robo3T官网
macOS 包管理器 Homebrew 移除 MongoDB

--
欢迎转载,转载请注明出处:
champyin.com/2019/10/10/…

相关文章
相关标签/搜索