mongoose
是一個ODM(Object Data Model)的庫,也叫作對象數據模型。那麼爲何說是對象數據模型
呢?html
注:MongoDB或者Mongo是NoSQL類型的數據庫,也就是說是非關係型的數據庫。node
它被用來處理數據,實現對象間的轉換。git
若是不明白,或者似懂非懂,若是看了下文,相信你會明白很多。github
Collections
Mongo中的Collections
至關於關係數據庫中的表(tables),它包含了大量的JSON文檔(document)。mongodb
Documents
Documents
至關於SQL中的記錄
(records)或者行
(rows)。在SQL中須要用多個表,經過數據間的引用來表達數據間的關聯,可是在Mongo中能夠經過一個Document
來實現。數據庫
Schema
SQL定義一個schema
經過表(table)的定義,而MongoDB中是沒有這個的,若是咱們使用MongoDB直接插入的就是一個document
。mongoose它定義了一個schema
來表示document
的數據結構或者構造函數,它是創建在應用層面上的,每一個docuemnt都是它的示例對象。設計模式
Fields
Fields
或者稱之爲屬性,它至關於SQL中的列
(columns),它用來造成一個個schema
。api
Models
和Schema
同樣它也是一個數據結構或者構造函數,不過它更特殊。它使用schema
建立了一個Document
的實例,這個實例至關於SQL中的記錄
(record)。數據結構
mongoose中的schema
是document
的構造函數,使用它能夠定義一個document
的默認值,進行字段(fields)的驗證。mongoose
mongoose中的model
提供了一個訪問數據的接口,經過它能夠實現對document
(也能夠叫作記錄)的CRUD(增,查,改,刪)。
因此,能夠這麼說model
是Schema
的包裝器,經過包裝實現了Schema
結構的數據與MongoDB數據庫之間的交互。
注:在開發過程當中,使用的都是Model
和Schema
的實例,因此能夠理解文章開篇說的對象轉換
和對象數據模型
。具體可參考下面的示例代碼。
使用前須要先安裝mongooe
,可經過yarn install mongoose
來安裝,而後經過以下代碼來引用:
// 引用mongoose let mongoose = require('mongoose')
說明:Schema
和Model
不是顯式的鏈接到了數據庫,爲何這麼說呢,由於開發的過程當中,不是使用的mongoose.connect("mongodb://127.0.0.1:27017")
返回的對象建立的Schema
和Model
,而是直接使用的mongoose
的引用,這樣作的好處很明顯,極大地提高了性能。
mongoose定義使用了單例設計模式,因此使用require
返回了一個單例對象,這在開發中比較常見,對於寫本身的庫有指導意義。
// 引用mongoose let mongoose = require('mongoose') // 鏈接到demo測試數據庫 mongoose.connect('mongodb://127.0.0.1:27017/demo')
每個collection
中的全部document
都使用同一個Schema
定義的field
。每個document
對象的鍵名經過Schema
來定義。
// 引用mongoose let mongoose = require('mongoose') // 鏈接到demo測試數據庫 mongoose.connect('mongodb://127.0.0.1:27017/demo') // 定義並實例化一個Schema let userSchema = new mongoose.Schema({ firstname: String, lastname: String })
一樣在Schema
中能夠對field
進行驗證,如:firstname
是String
類型的。
Schema
的字段值能夠是Array,String,Boolean,Buffer,Date,Number,ObjectId,或者Mixed(泛型,或者一個可變化的數據類型)。
// 引用mongoose let mongoose = require('mongoose') // 鏈接到demo測試數據庫 mongoose.connect('mongodb://127.0.0.1:27017/demo') // 定義並實例化一個Schema let UserSchema = new mongoose.Schema({ firstname: String, lastname: String }) // 定義一個Model let UserModel = mongoose.model('User', userSchema) // 實例化一個Model let person = new Usermodel({ firstname: '東坡', lastname: '蘇' })
可能有的人會比較疑惑,爲何Schema的定義和實例化能夠放在一塊兒,而Model的定義和實例化要分開?由於schema
的實例不牽涉到具體的操做,而Model
的實例每每牽涉到複雜的操做。因此前者在開發中每每兩個步驟一塊兒來作,後者分開來作。
person .save() .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })
UserModel .find({ lastname: '蘇' // query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })
UserModel .findOneAndUpdate( { lasttname: '蘇' // query }, { firstname: 'xxx' // field:values 的更新 }, { new: true, // 返回更新後的document runValidators: true // 在更新前進行驗證 }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })
UserModel .findOneAndRemove({ firstname: '東坡' }) .then(response => { console.log(response) }) .catch(err => { console.error(err) })
固然,mongoose還提供了不少很實用的api,這裏就很少說了。mongoose queries