mongoose 再認識(一)

mongoose 是一個ODM(Object Data Model)的庫,也叫作對象數據模型。那麼爲何說是對象數據模型呢?html

注:MongoDB或者Mongo是NoSQL類型的數據庫,也就是說是非關係型的數據庫。node

它被用來處理數據,實現對象間的轉換。git

  • 數據處理:建立一個Schema,提供Schema的數據驗證功能。
  • 對象的轉換:這些對象是指開發過程當中建立的對象和MongodDB中表明的相應對象。

若是不明白,或者似懂非懂,若是看了下文,相信你會明白很多。github

經常使用的術語

Collections

Mongo中的Collections至關於關係數據庫中的表(tables),它包含了大量的JSON文檔(document)。mongodb

Documents

Documents至關於SQL中的記錄(records)或者(rows)。在SQL中須要用多個表,經過數據間的引用來表達數據間的關聯,可是在Mongo中能夠經過一個Document來實現。數據庫

NoSQL的Documents VS SQL 中的關聯Tables

Schema

SQL定義一個schema經過表(table)的定義,而MongoDB中是沒有這個的,若是咱們使用MongoDB直接插入的就是一個document。mongoose它定義了一個schema來表示document 的數據結構或者構造函數,它是創建在應用層面上的,每一個docuemnt都是它的示例對象。設計模式

Fields

Fields 或者稱之爲屬性,它至關於SQL中的(columns),它用來造成一個個schemaapi

Models

Schema同樣它也是一個數據結構或者構造函數,不過它更特殊。它使用schema建立了一個Document的實例,這個實例至關於SQL中的記錄(record)。數據結構

mongoose中的 Schema 和 Model

mongoose中的schemadocument的構造函數,使用它能夠定義一個document的默認值,進行字段(fields)的驗證。mongoose

mongoose中的model提供了一個訪問數據的接口,經過它能夠實現對document(也能夠叫作記錄)的CRUD(增,查,改,刪)。

因此,能夠這麼說modelSchema的包裝器,經過包裝實現了Schema結構的數據與MongoDB數據庫之間的交互。

注:在開發過程當中,使用的都是ModelSchema的實例,因此能夠理解文章開篇說的對象轉換對象數據模型。具體可參考下面的示例代碼。

引用mongoose

使用前須要先安裝mongooe,可經過yarn install mongoose來安裝,而後經過以下代碼來引用:

// 引用mongoose
let mongoose = require('mongoose')

說明:SchemaModel不是顯式的鏈接到了數據庫,爲何這麼說呢,由於開發的過程當中,不是使用的mongoose.connect("mongodb://127.0.0.1:27017")返回的對象建立的SchemaModel,而是直接使用的mongoose的引用,這樣作的好處很明顯,極大地提高了性能。

mongoose定義使用了單例設計模式,因此使用require返回了一個單例對象,這在開發中比較常見,對於寫本身的庫有指導意義。

鏈接到MongoDB數據庫

// 引用mongoose
let mongoose = require('mongoose')
// 鏈接到demo測試數據庫
mongoose.connect('mongodb://127.0.0.1:27017/demo')

定義一個Schema

每個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進行驗證,如:firstnameString類型的。

Schema的字段值能夠是Array,String,Boolean,Buffer,Date,Number,ObjectId,或者Mixed(泛型,或者一個可變化的數據類型)。

定義並實例化一個model

// 引用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的實例每每牽涉到複雜的操做。因此前者在開發中每每兩個步驟一塊兒來作,後者分開來作。

mongoose的CRUD

添加數據

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

mongoose系列文章

相關文章
相關標籤/搜索