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/…