mongoDB看這篇就夠了

pubdreamcc發表於2019-05-31

寫在前面

hello,小夥伴們,我是 pubdreamcc ,本篇文章依舊出至於我的 GitHub倉庫 node學習教程 ,如果你覺得我寫的還不錯,歡迎給個 star ,小夥伴們的 star 是我持續更新的動力 !

node學習教程GitHub

安裝 mongoDB

安裝這裡,我就不詳細介紹,大家可以根據官網選擇匹配自己電腦系統的版本安裝即可。

mongoDB download地址: download

下載下來之後,點選開啟直接下一步,下一步就 ok 了。

初體驗

  1. 配置環境變數

安裝完成後,會在安裝目錄下面生成一個 mongoDB 的資料夾,開啟資料夾,進入 bin 資料夾中,把這裡的路徑配置成環境變數。

  1. 建立儲存資料庫檔案 data

在任意碟符根目錄下建立一個 data 目錄,用來存放資料庫檔案。 mongoDB 會自動把自己安裝位置的碟符根目錄下的 data 資料夾作為自己的資料儲存目錄,這裡也可以直接在安裝位置所在碟符建立。

  1. 啟動 mongoDB 資料庫

如果 data 目錄建立在安裝位置的碟符根目錄下,直接
開啟命令列,敲入:

mongod

如果是其他位置,則需要指定資料存放的位置:

mongod --dbpath 檔案路徑

如果看到輸出: waiting for connections on port 27017 說明啟動資料庫成功。

  1. 連線資料庫

再開啟一個命令列,敲入 mongo ,則會預設連線到本地開啟的資料庫。好了,到這裡我們就完成了如何開啟一個 mongoDB 資料庫了,接下來只需往資料庫裡存資料,運算元據即可。

MongoDB 概念解析

mongodb中有三個基本核心的概念:

  • 文件

  • 集合

  • 資料庫

它們之間是逐層包含的關係,一個集合可以包含多個文件,一個資料庫可以有多個集合,下面聽我逐一道來:

文件 : 文件是一個鍵值(key-value)對(即BSON),本質類似於json物件 的鍵值對。

{"name":"pubdreamcc", "age": 24}

集合:集合就是 MongoDB 文件組,實質上就是包含多個物件的陣列。

比如,我們可以將以下不同資料結構的文件插入到集合中:

{"name":"pubdreamcc"}
{"name":"pubdreamcc1","name":"pubdreamcc2"}
{"name":"pubdreamcc3","name":"pubdreamcc4","num":5}

資料庫(dataBase)

這裡的資料庫概念同 關係型資料庫中的資料庫概念一致,資料庫可以包含多個集合。

下面給出一張圖用來表示 mongoDB 中的一些概念同 SQL 概念 的 對比,輔助理解。

mongoDB看這篇就夠了

mongoDB基本操作

在剛才我們連線上本地資料庫之後,在這個命令列,我們可以進行很多 mongoDB 提供的增刪改查等的基本操作,且聽我一一道來。

  1. 建立資料庫 : use 資料庫名稱

如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。

MongoDB 中預設的資料庫為 test,如果你沒有建立新的資料庫,集合將存放在 test 資料庫中。

  1. 檢視所有資料庫: show dbs

  2. 刪除資料庫: db.dropDatabase(),你可以使用 db 命令檢視當前資料庫名。

  3. 建立集合: db.createCollection(集合名稱)

  4. 檢視已有集合: show collections

  5. 刪除集合:db.集合名稱.drop()

如果成功刪除選定集合,則 drop() 方法返回 true,否則返回 false

  1. 插入文件:db.集合名稱.insert(document)。往指定集合插入文件,文件的資料結構和 JSON 基本一樣。

  2. 更新文件: update() 方法用於更新已存在的文件,語法格式:

db.collection.update(
  <query>,
  <update>,
  {
    upsert: <boolean>,
    multi: <boolean>,
    writeConcern: <document>
  }
)

引數說明

  • query : update的查詢條件,類似sql update查詢內where後面的。
  • update : update的物件和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的。

  • upsert : 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。

  • multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。

  • writeConcern :可選,丟擲異常的級別。

  1. 刪除文件:
db.collection.remove(
  <query>,
  <justOne>
)

引數說明

  • query :(可選)刪除的文件的條件。

  • justOne : (可選)如果設為 true 或 1,則只刪除一個文件,如果不設定該引數,或使用預設值 false,則刪除所有匹配條件的文件。

  • writeConcern :(可選)丟擲異常的級別。

  1. 刪除集合所有資料:db.collection.remove({})

  2. 查詢文件:db.collection.find(query, projection)

引數說明

  • query :可選,使用查詢操作符指定查詢條件。

  • projection :可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。

PS:

如果你需要以易讀的方式來讀取資料,可以使用 pretty() 方法,語法格式如下:

db.col.find().pretty()

pretty() 方法以格式化的方式來顯示所有文件。

  1. 查詢一個文件(匹配條件的第一個):db.collection.findOne()

Node操作mongoDB

方法一:

  • 使用 mongoDB 官方提供的 node mongodb drivermongoDB ,這種方法是官方提供的,感興趣的同學可以去 npm 官網查詢文件,這裡推薦下面一種方法。

mongoDB npm 文件

方法二:

  • 使用 mongoose

Mongoose 是在 node.js 環境下對 mongodb 進行便捷操作的物件模型工具。

官方 api 文件

下面說明下 mongoose 的具體用法。

  1. 安裝 mongoose
npm install mongoose

安裝完成後,開啟mongodb。命令列敲入:mongod,即可開啟 mongodb

  1. 利用mongoose連線mongodb

新建一個js檔案,引入mongoose,這裡可以參照官網 寫的一個 hello world

const mongoose = require('mongoose')
// 連線資料庫
mongoose.connect('mongodb://資料庫地址(包括埠號)/資料庫名稱', (err, ret) => {
  if (err) {
    console.log('連線失敗')
  } else {
    console.log('連線成功')
  }
})

這樣,我們就可以連線上資料庫了,注意:如果沒有指定資料庫名稱,則預設連線 test 資料庫。

  1. 建立 Schema ,設計文件結構

Schema 到底是個什麼東西呢,我們在往資料庫插入資料之前是不是應該得稍微設計下文件的結構,也就是關聯式資料庫中表的結構啥的,因為有一定的設計才使得資料的完整性,不會產生髒資料,Schema就是用來幹這個事情的,我們看下官方的介紹

Schema 主要用於定義 MongoDB 中集合 Collection 裡文件 document 的結構。mongoose 對錶結構的定義,每個 Schema 會對映到mongodb中的一個 collectionSchema 不具備運算元據庫的能力。

定義Schema非常簡單,指定欄位名和型別即可,支援的型別包括以下8種:

String      字串
Number      數字    
Date        日期
Buffer      二進位制
Boolean     布林值
Mixed       混合型別
ObjectId    物件ID    
Array       陣列

通過mongoose.Schema來呼叫Schema,然後使用new方法來建立schema

// 引入Schema
const Schema = mongoose.Schema
// 通過 new 建立一個Schema
const userSchema = new Schema({
  // 這裡來設計文件的結構,後面插入集合的每一個文件必須是以下指定的結構
  name: {
    type: String,
    required: true //  規定 name 是必須有的欄位
  },
  password: {
    type: String,
    required: true
  },
  email: {
    type: String
  }
})

通過以上的例項,我們就建立了一個 userSchema 的架構,規定了每個文件中必須有 namepassword 欄位,且型別為 Stringemail 欄位型別為 String,有或沒有都可以。

  1. Schema 釋出為 model (模型)

簡單說就是model是由 Schema 生成的模型,可以對資料庫的操作。model的每一個例項(instance)就是一個文件。

把 Schema 釋出為模型只需呼叫mongoose的 mongoose.model() 方法即可,mongoose.model() 接收兩個引數,第一個參數列示模型的名稱,第二個引數是 Schema,返回值為模型建構函式。這裡一定得把第一個引數設定成和 mongoose.model() 的返回值相同,否則會出錯。最後得到的集合名稱就為模型名稱的小寫形式,如果模型名稱最後一個字元是字母,則變成複數形式,如果最後一個是數字,則不變,比如:模型名稱:User,得到的集合名稱為: users,模型名稱為:User1, 得到的集合名稱為;user1

// 把Schema 釋出為模型
const User = mongoose.model('User', userSchema)
  1. 通過模型建構函式,可以對資料庫進行一系列增刪改查的操作。

好了,我們經過以上的步驟,最後就可以通過 User 模型建構函式運算元據庫了。

mongoose 操作 mongoDB

增加資料

例項化一個模型建構函式就得到一個具體文件。

const user = new User({
  // 傳入具體的資料資訊,必須和之前的Schema 配置的結構一致
  name: 'pubdreamcc',
  password: '123456',
  email: '333@pubdreamcc.com' // 可有可無
})

// 通過save()方法持久化儲存資料

user.save((err, ret) => {
  if (err) {
    console.log('儲存失敗')
  } else {
    console.log('儲存成功')
    console.log(ret) // ret 就是剛新增加的文件
  }
})

ok, 通過上面兩步我們就已經儲存了一條資料到資料庫中了,就是怎麼簡單。

查詢資料

查詢資料這裡有好幾個 API , 可以看下 mongoose 的官網:

  • find()
  • findById()
  • findOne()

具體的用法和之前在控制檯 操作mongoDB 資料類似,不清楚的同學可以檢視本章第一節知識點: mongoDB資料庫的使用

這裡選取一個findOne代表

User.findOne({name: 'pubdreamcc'}, (err, ret) => {
  if (err) {
    console.log('查詢失敗')
  } else {
    console.log(ret) // ret 即為查詢出來的那一條文件
  }
})

findOne() 會查詢匹配的第一個文件出來,通常傳入一個查詢條件(物件),這裡是從資料庫查詢 namepubdreamcc 的文件出來。

刪除資料

刪除資料同樣也有好幾個方法,這裡參照官網 api :

  • remove()
  • findOneAndRemove()
  • findByIdAndRemove()

用法其實和更新資料,包括前面說到的查詢資料類似,remove() 會刪除所有匹配的全部文件,findOneAndRemove() 會刪除匹配的第一個文件,findByIdAndRemove() 通過唯一的id值刪除某一個文件。

這裡選取findByIdAndRemove() 來說明,其他的小夥伴可以去 mongoose 官網 api 查詢,我就不再反覆說了,用法很簡單,大家看一下都懂的。

mongoose 官網 api: api document

User.findByIdAndRemove('id值', (err, ret) => {
  if (err) {
    console.log('刪除失敗')
  } else {
    console.log('刪除成功')
    console.log(ret) // ret 即為刪除資訊反饋物件,包括成功刪了幾條資料等
  }
})

更新資料

更新資料也有幾個 api 可以供我們使用,我就羅列下,然後也是選取一個加以說明,其他的小夥伴們可以去官網檢視 api 即可。

  • findByIdAndUpdate()
  • update()
  • findOneAndUpdate()

這裡選取 update() 來演示下:

User.update({name: 'pubdreamcc'}, {email: '111@pubdreamcc.com'}, (err, ret) => {
  if (err) {
    console.log('更新失敗')
  } else {
    console.log('更新成功')
  }
})

update() 方法會把所有滿足條件的資料都更新,上面我們已經把 name 為: pubdreamcc 的所有文件的email 都修改為 111@pubdreamcc.com

總結

本文也是我查閱相關資料,看了很多mongoDB的資料總結而來,如果有那些地方有差錯,歡迎留言評論。

需要演示的原始碼可以去GitHub倉庫檢視。

ok,that's all , thank you !

相關文章