node.js
的出现,使得用前端语法(javascript)开发后台服务成为可能,愈来愈多的前端所以所以接触后端,甚至转向全栈发展。后端开发少不了数据库的操做。MongoDB
是一个基于分布式文件存储的开源数据库系统。本文为你们详细介绍了如何用node.js
+mongoose
玩转MongoDB
。但愿能帮到有须要的人。javascript
因为我用Mac开发,如下全部操做都是在Mac下进行。html
有 node 环境的能够跳过。前端
nodejs官网提供了 macOS 安装包,直接下载安装便可。如今 nodejs 稳定版已经到了 12.11.1
。java
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
Homebrew 是 macOS 的包管理器。由于 OSX 默认不包含 Homebrew brew 包,因此要先安装,已经安装过的能够跳过。数据库
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码
安装过程会有点长,终端输出信息超过一屏,这里我只截取了头尾两部分。 npm
brew tap mongodb/brew
复制代码
brew install mongodb-community@4.2
复制代码
如今你的 Mac 上就已经安装好 MongoDB 环境了。
node.js 是能够直接操做 MongoDB 的,可是经过 MongoDB 命令语法直接编写 MongoDB 验证、数据类型转换和业务逻辑模版比较繁琐。因此咱们使用了 mongoose。
mongoose 是 MongoDB 的一个对象模型工具,它对 MongoDB 的经常使用方法进行了封装,让 node.js 操做 MongoDB 更加优雅简洁。
刚才的 node.js 和 MongoDB 都是安装在全局环境,mongoose 则是安装在你的项目下:
cd your-project
npm i -S mongoose
复制代码
如今,你的开发环境就已经所有安装好了。
要操做 MongoDB ,首先要启动它。 有两种方式启动 MongoDB 服务:
mongod --config /usr/local/etc/mongod.conf
复制代码
前台运行的好处就是,能够查看一些反馈和日志,便于调试。另外若是要关闭服务,只须要在终端按 control + c
键便可。
brew services start mongodb-community@4.2
复制代码
好处是开机就自动启动,随时可使用。
stop
命令:
brew services stop mongodb-community@4.2
复制代码
如今,你的 MongoDB 数据库已经开启了。
操做以前先解释一下MongoDB和mongoose里的一些核心概念。
MongoDB
BSON
格式的文件(BSON是一种用二进制描述的JSON文件格式)。文件
存储在集合
中,将集合
存储在数据库
中。集合collection
: 至关于关系型数据库中的表table
。文件document
: MongoDB 的数据记录单位,至关于关系型数据库中的记录row
。mongoose
schema
: 在 mongoose 中,全部的东西都来源于一个 schema
,每一个schema
映射了一个 MongoDB 的集合
,它定义了这个集合
中的文档
的骨架。model
: 一个文件
的构造器,经过编译schema
获得,一个model
的实例就是一个文件
,model
负责从 MongoDB 数据库中建立和读取文档
。更多mongoose概念能够在mongoose guide中查阅。
数据库操做:
在项目中建立 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
复制代码
能够看到打印出“打开 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模块。
复制代码
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版安装便可。
点击 Robo3T 左上角链接咱们的数据库后,能够看到 MongoDB 自动帮咱们生成了数据库和集合,而且已经插入了一条记录:
或者还能够直接经过Model的create方法直接插入数据,返回的也是一个Promise:
StudentModel.create({
name: 'lisi',
age: 19
}).then((doc) => {
console.log(doc)
})
复制代码
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
复制代码
能够看到name
为lisi
的记录被打印了出来。
若是想查询整个集合:
// 不放查询条件即查询全部的记录
StudentModel.find({}).then(doc => {
console.log(doc);
})
复制代码
能够看到集合中的全部记录被打印了出来。
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,能够看到数据被更改,切换到表格模式更加直观:
不过在终端,提示DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
意思是建议咱们使用 updateOne
、updateMany
或者bulkWrite
update 更新查询到的全部结果,方法已经不提倡使用,已被updateMany替代。 updateOne 若是查询到多条结果,只更新第一条记录。 upateMany 更新查询到的全部结果。 bulkWrite 提供可控执行顺序的批量写操做。
为了代码的健壮性,咱们应该根据建议将update方法换成updateMany方法。
另外,终端的输出{ n: 1, nModified: 1, ok: 1 }
的意思是:
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的记录了:
在看终端的输出,跟update相似,也提示建议使用新的方法代替。
意思是建议咱们使用 removeOne
、removeMany
或者bulkWrite
remove 删除查询到全部结果,方法已经不提倡使用,已被removeMany替代。 removeOne 若是查询到多条结果,只删除第一条记录。 removeMany 删除查询到全部结果。 bulkWrite 提供可控执行顺序的批量写操做。
另外,终端的输出{ n: 1, ok: 1, deletedCount: 1 }
的意思跟update的相似,就不累述了。
如今咱们已经成功地对 MongoDB 数据库进行了 CRUD(添加、读取、更新、删除)操做。欢呼~
更多高级操做,能够到mongoose API 文档中查阅。
梳理一下,主要讲了这些内容:
node.js+MongoDB+mongoose
在Mac下的环境搭建,注意使用最新的 MongoDB
的安装方式。MongoDB
服务。MongoDB
和 mongoose
的基本核心概念。Robo3T
来更直观地观察数据库。前端也能玩转数据库开发。 欢迎交流~
文章源码地址:github.com/yc111/mongo…
相关网站:
Homebrew官网
MongoDB官网
monggose官网
Robo3T官网
macOS 包管理器 Homebrew 移除 MongoDB
--
欢迎转载,转载请注明出处:
champyin.com/2019/10/10/…