1、安装 MongoDBhtml
1. 在 Windows 环境下安装:git
// Windows 7 / Server 2008 R2 以上的版本github
打开官网连接 https://www.mongodb.com/try/download/communitysql
在页面中依次选择 On-Premises => MongoDB Communtiy Server,而后选择 Platform 为 Windows,最后下载并执行安装包mongodb
1. 在 MacOS 安装: shell
也能够按照上面的方法下载安装包,或者选择 Download 按钮旁的 Copy Link,经过 curl 命令安装数据库
不过还有另外一种不须要打开 MongoDB 官网的办法:直接使用 brew 安装(参考连接)
json
首先 tab 仓库vim
brew tap mongodb/brew
而后安装社区版本c#
brew install mongodb-community
安装的时候会自动建立配置文件:
能够用 mongod --version 命令来检查是否安装成功
若是能正常显示当前版本,就说明安装成功,能够直接进入下一节
若是提示 "command not found: mongod" ,就得手动配置环境变量
须要先找到 mongod 的安装位置,因为安装的版本不一样,路径不会彻底一致,能够一步一步的来找:
先进入 Cellar 目录:
cd /usr/local/Cellar
而后经过 ls 命令查看当前目录下的文件,而后进入带有 mongodb 的文件夹,而后逐步深刻,直到进入 bin 文件夹,使用 pwd 命令查看完整路径
记下这个路径备用,打开环境变量配置文件
vim ~/.bash_profile
添加一行变量(把路径改为本身的路径)
export PATH=/usr/local/Cellar/mongodb-community/4.2.8/bin:${PATH}}
保存文件,执行如下命令
source ~/.bash_profile
而后就可使用 mongod 命令了
2、启动 MongoDB
若是直接启动
mongod
会直接报错 Data directory /data/db not found
这是由于使用不带参数的 mongod 命令会使用默认的数据目录 /data/db
若是使用以前建立的配置文件启动就不会有问题:
mongod --config /usr/local/etc/mongod.conf
若是以为这样的启动命令很累赘,就建立一个 /data/db 目录
sudo mkdir -p /data/db
而后就能使用 mongod 命令启动了,
// 若是遇到 Address already in use 这个错误,是由于端口号占用,清理对应端口的 pid 便可
能够在浏览器访问 localhost:27017 确认是否成功启动
若是须要关闭服务器,可使用 Crtl + C 组合键
这个启动 mongod 的终端能够放在一边了,新起一个终端,打开 MongoDB shell
mongo
注意这个命令不是 mongod
在启动的 shell 里面输入 help,查看可用的命令
若是不想使用命令行来操做 MongoDB,可使用可视化工具,好比 Robomongo、Nosqlclient、Navicat
3、MongoDB 建立数据
接下来在 MongoDB 中插入数据,首先建立一个数据库
use Movie
这里建立了一个名为 Movie 的数据库,但这时的 Movie 数据库尚未数据,因此 show dbs 不会列出刚才建立的数据库
在当前数据库中建立一个集合,并插入一条数据
db.createCollection("movies") db.movies.insert({"name":"让子弹飞","years":"2010","director": ["姜文"]})
注意: 和建立数据库相似,在 MongoDB 中,建立集合后要再插入一个文档,集合才会真正建立
当插入了具体的数据以后,数据库才算建立完成,接下来了解一下基本的增删改查
1. 新增数据
在 MongoDB 中可使用 insert 向集合插入数据,每条新建的数据都会自动生成一个主键 _id
使用 insert 插入数据时,若是没有携带主键 _id,则新增数据;
若是携带了 _id 且 _id 没有重复,则新增一条自带 _id 的数据(不会自动生成 _id);
若是携带了 _id 且 _id 冲突,则抛出“主键重复”的错误,保存失败。
2. 查询数据
在 MongoDB 中查询数据通常使用 find 方法
db.movies.find().pretty()
这里的 pretty() 用来格式化查询结果
在查询条件中,还能够加入条件判断
3. 更新数据
在 MongoDB 中使用 update 和 replaceOne 来更新集合中的文档
其中 update() 能够接收三个参数
第一个参数为查询条件,和上面的 find 相似;
第二个参数为操做符,好比 $set 用来设置新属性;
第三个参数为配置项,暂时不提。
这里我先新增了一条数据,而后经过 update 修改了这条数据的 name
能够看到,只有 name 被修改了,years 并无发生变化,也就是说 update() 的 $set 只会合并相应的字段
若是须要替换整条数据,能够用 replaceOne()
4. 删除数据
可使用 remove 来删除集合中的数据
该方法和 find 相似,都是接受一个查询条件,而后从集合中删除查询到的文档
remove 的 query 参数是必填的,若是往 remove 方法中传入的查询条件为空对象 {},会删除整个集合的数据
另外, 可使用 drop 来删除集合,dropDatabase 来删除数据库
db.collection.drop()
db.dropDatabase()
关于 MongoDB 的介绍就到这里,深刻了解能够参考 MongoDB 中文网
4、在 Koa 中链接 MongoDB
先建立一个 Koa 项目,能够参考以前的文章《Node.js 蚕食计划(五)—— Koa 基础项目搭建》
在项目的根目录建立一个 mongodb 目录,而后在该目录下新建 config.js,用来保存一些数据库常量配置
// /mongodb/config.js
const dbUrl = 'mongodb://127.0.0.1:27017'; // 数据库地址
const dbName = 'Movie'; //数据库名称
module.exports = { dbUrl, dbName }
而后安装 mongodb 中间件
yarn add mongodb
在 mongodb 目录下建立一个 index.js,使用中间件链接 MongoDB 数据库
// /mongodb/index.js
const { MongoClient, ObjectID} = require('mongodb'); const { dbUrl, dbName } = require('./config'); // 链接数据库
MongoClient.connect(dbUrl, (err, client) => { console.log("Connected successfully to server"); const db = client.db(dbName); // db.close(); // 关闭链接
});
个人项目结构是这样的,其中 app.js 是入口文件
能够在 app.js 中 require('./mongodb') 直接引入刚才的 index.js,检查一下是否可以正常链接数据库
启动项目,若是在 MongoDB 的终端看到链接的提示,则表示成功链接数据库
5、封装 MongoDB 类
实际场景中确定不会每次查询都调用一次数据库,因此须要封装一个类,经过类的实例来操做数据库
// /mongodb/index.js
const { MongoClient, ObjectID } = require("mongodb"); const Config = require("./config"); class Db { static getInstance() { // 单例模式 解决屡次实例化 实例不共享的问题
if (!Db.instance) { Db.instance = new Db(); } return Db.instance; } constructor() { this.dbClient = ""; //db对象
this.connect(); // 实例化的时候就链接数据库
} connect() { // 链接数据库
return new Promise((resolve, reject) => { if (!this.dbClient) { //解决数据库屡次链接的问题
MongoClient.connect(Config.dbUrl, { useUnifiedTopology: true }, (err, client) => { if (err) { reject(err); return; } this.dbClient = client.db(Config.dbName); resolve(this.dbClient); }); } else { resolve(this.dbClient); } }); } //查找操做 collection:表名 json:查找条件
find(collection, json) { return new Promise((resolve, reject) => { this.connect().then((db) => { let result = db.collection(collection).find(json); result.toArray((err, docs) => { if (!err) { resolve(docs); } else { reject(err); } }); }); }); } //新增操做
insert(collection, json) { return new Promise((resolve, reject) => { this.connect().then((db) => { db.collection(collection).insertOne(json, (err, result) => { if (!err) { resolve(result); } else { reject(err); } }); }); }); } //修改操做
update(collection, json1, json2) { return new Promise((resolve, reject) => { this.connect().then((db) => { db.collection(collection).updateOne( json1, { $set: json2, }, (err, result) => { if (!err) { resolve(result); } else { reject(err); } } ); }); }); } //删除操做
delete(collection, json) { return new Promise((resolve, reject) => { this.connect().then((db) => { db.collection(collection).removeOne(json, (err, result) => { if (!err) { resolve(result); } else { reject(err); } }); }); }); } //在进行查询或者删除操做的时候,咱们通常都会经过id去进行操做,可是咱们直接使用传递过来的id是不起做用的,须要使用mongodb提供的ObjectID方法,生成一个新的id去查询。
getObjectID(id) { return new ObjectID(id); } } module.exports = Db.getInstance();
// 代码摘自 https://juejin.im/post/5e4765626fb9a07cad3b93dc#heading-24
封装好了,在 app.js 试试
//...
const bodyParser = require('koa-bodyparser'); const DB = require('./mongodb');
//...
app.use(bodyParser()); router.post('/save', async(ctx, next) => { const form = ctx.request.body; console.log('form------>', form); const result = await DB.insert('movies', form); // 新增
ctx.body = result; }); router.get('/list', async(ctx, next) => { const result = await DB.find('movies', {}); // 查询
ctx.body = result; }); //...
上面引入了 koa-bodyparser 来处理 POST 请求的参数
而后写了一个新增数据的 post 接口 /save,和查询数据的 get 接口 /list
接下来先用 PostMan 测试一下 /save 接口
这里传的参数是 JSON 格式,须要在 Headers 中设置 Content-Type 为 application/json
若是设置为 application/x-www-form-urlencoded,就须要用 querystring 转码
保存成功以后,再试试 /list 接口
到这里一个简单的后端服务就搭好了
但一个工程化的后端项目,一般会设计 controller 来管理 API,还会经过 Schema 来规范集合
这些内容会在后面的文章中介绍
参考资料: