mongoDB看這篇就夠了

寫在前面

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

node學習教程GitHubhtml

安裝 mongoDB

安裝這裏,我就不詳細介紹,你們能夠根據官網選擇匹配本身電腦系統的版本安裝便可。java

mongoDB download地址: downloadnode

下載下來以後,點擊打開直接下一步,下一步就 ok 了。git

初體驗

  1. 配置環境變量

安裝完成後,會在安裝目錄下面生成一個 mongoDB 的文件夾,打開文件夾,進入 bin 文件夾中,把這裏的路徑配置成環境變量。github

  1. 建立存儲數據庫文件 data

在任意盤符根目錄下建立一個 data 目錄,用來存放數據庫文件。 mongoDB 會自動把本身安裝位置的盤符根目錄下的 data 文件夾做爲本身的數據存儲目錄,這裏也能夠直接在安裝位置所在盤符建立。sql

  1. 啓動 mongoDB 數據庫

若是 data 目錄建立在安裝位置的盤符根目錄下,直接
打開命令行,敲入:mongodb

mongod

若是是其餘位置,則須要指定數據存放的位置:shell

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 提供的增刪改查等的基本操做,且聽我一一道來。

  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 !

相關文章
相關標籤/搜索