Mongoose簡要API

Mongoose是在node.js環(huán)境下對MongoDB進行便捷操作的對象模型工具

因此,要使用mongoose,則必須安裝node.js環(huán)境以及MongoDB數(shù)據(jù)庫。mongoose使MongoDB操作更加簡單便捷,本文主要是總結(jié)一些mongoose的schema數(shù)據(jù)模型定義以及簡單的增刪改查api。

connect

connect是用于創(chuàng)建數(shù)據(jù)庫鏈接

//url(s):數(shù)據(jù)庫地址,可以是多個,以`,`隔開
//options:可選,配置參數(shù)
//callback:可選,回調(diào)
mongoose.connect('mongodb://數(shù)據(jù)庫地址(包括端口號)/數(shù)據(jù)庫名稱')

指定用戶鏈接

mongoose.connect('mongodb://用戶名:密碼@127.0.0.1:27017/數(shù)據(jù)庫名稱')

鏈接多個數(shù)據(jù)庫

如果你的app中要連接多個數(shù)據(jù)庫,只需要設置多個url即可,url之間以==,==隔開,同時設置mongos為true

mongoose.connect('urlA,urlB,...', {
   mongos : true 
})

schema && model

schema是一種以文件形式存儲的數(shù)據(jù)模型骨架,不具備數(shù)據(jù)庫的操作能力

schema可以理解為mongoose對表結(jié)構(gòu)的定義(不僅僅可以定義文檔的結(jié)構(gòu)和屬性,還可以定義文檔的實例方法、靜態(tài)模型方法、復合索引等),每個schema會映射到MongoDB中的一個collection,schema不具備操作數(shù)據(jù)庫的能力。

定義schema

//語法
new mongoose.Schema({字段...}, [options])

//實例
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const ObjectId = Schema.Types.ObjectId

const ArticleSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    contents: String,
    author: String,
    category: {
        type: ObjectId,
        ref: 'Category' //關(guān)聯(lián)Category表的_id
    },
    createTime: {
        type: Date,
        default: Date.now
    }
}, {
    connection: 'Article', //模型名稱,
})

字段類型

schema中支持以下字段類型:

  • String
  • Number
  • Date
  • Buffer
  • Boolean
  • Mixed
  • ObjectId
  • Array

schema中不僅僅可以設置字段類型,同時還可以設置默認值(default),關(guān)聯(lián)文檔(ref)、required等。一旦設置了字段類型,如果出現(xiàn)錯誤,比如某字段類型為Boolean,而輸入了一個其他類型,mongoose將會拋出類型錯誤提示。

options

//常用到的`collection`,其他請參考[文檔](http://www.nodeclass.com/api/mongoose.html#index_Mongoose-Schema)
{
    _id : true, //Boolean, 唯一索引, 如果不需要,可以設置為false關(guān)閉
    collection : '文檔名稱', //在MongDB中默認使用Model的名字作為集合的名字,如過需要自定義集合的名字,可以通過設置這個選項
    versionKey : '__v', //包含文檔的內(nèi)部修訂,默認的是__v
    autoIndex, 
    capped : Number, //上限設置,此屬性對批量操作有效,用來限制一次對數(shù)據(jù)庫操作的量
    id, //mongoose分配給每一個schema一個虛擬屬性id,它是一個getter。返回的是_id轉(zhuǎn)換為字符串后的值
    read,
    safe,
    shardKey,
    strict,
    toJSON,
    toObject
}

Model

Model 是由schema編譯而成的假象構(gòu)造器,具有抽象屬性和行為。Model的每個實例(instance)就是一個document,document可以保存到數(shù)據(jù)庫和對數(shù)據(jù)庫進行操作。

//語法
mongoose.model(`文檔名稱`, Schema)
//實例
module.exports = mongoose.model(`Article`, ArticleSchema )

Methods 實例方法

Model的實例是document。內(nèi)置實例方法如save,可以通過methods屬性給實例自定義擴展方法

ArticleSchema.methods.methodFunc = function() {
  // body...
}

find

find用來查詢多條文檔

Model.find(conditions, [fields], [options], [callback])
conditions <Object> //查詢條件
[fields] <Object> //要查詢的字段
[options] <Object> //查詢配置參數(shù)
[callback] <Function> //回調(diào)

條件查詢

條件查詢中常用屬性

  • $or    或關(guān)系

  • $nor    或關(guān)系取反

  • $gt    大于

  • $gte    大于等于

  • $lt    小于

  • $lte    小于等于

  • $ne    不等于

  • $in    在多個值范圍內(nèi)

  • $nin    不在多個值范圍內(nèi)

  • $all    匹配數(shù)組中多個值

  • $regex    正則,用于模糊查詢

  • $size    匹配數(shù)組大小

  • $maxDistance    范圍查詢,距離(基于LBS)

  • $mod    取模運算

  • $near    鄰域查詢,查詢附近的位置(基于LBS)

  • $exists    字段是否存在

  • $elemMatch    匹配內(nèi)數(shù)組內(nèi)的元素

  • $within    范圍查詢(基于LBS)

  • $box    范圍查詢,矩形范圍(基于LBS)

  • $center    范圍醒詢,圓形范圍(基于LBS)

  • $centerSphere    范圍查詢,球形范圍(基于LBS)

  • $slice    查詢字段集合中的元素(比如從第幾個之后,第N到第M個元素

如要查詢閱讀量大于500小于600的文章

Article.find({views : {$gte : 500 , $lte : 600}})

findById

findById 用來通過id查詢單條文檔

Model.findById(id, [fields], [options], [callback])

findOne

findOne 用來通過條件查詢單條文檔

Model.findOne(conditions, [fields], [options], [callback])

populate

populate用于查看關(guān)聯(lián)文檔內(nèi)容, 也就是查詢 設置了 ref 的字段關(guān)聯(lián)的 文檔的相關(guān)字段

Model.populate(docs, options, [cb(err,doc)])

//示例
yield Article.findOne({_id : id}, {title : 1, author : 1})
    .populate('category', {select : {name : 1, _id : 1}})
//查找_id 為 id 的文章的category字段對應的category表中的分類名稱和id

//多個關(guān)聯(lián)表需要使用數(shù)組

yield Article.findOne({
        _id: id
    }, {
        title: 1,
        author: 1
    })
    .populate([{
        path: 'comments', //文章的comments字段
        select: {
            _id: 1,
            user: 1,
            text: 1,
        },
    }, {
        path: 'category' //文章的category字段,
        select: {
            fields...
        }
    }])

分頁和排序
yield Article.findOne({
    _id: id
}, {
    title: 1,
    author: 1
}, {
    sort: { 
        createTime: -1, //倒序 desc
        _id: -1
    },
    skip: (page - 1) * pageSize, //page : 當前頁碼, pageSize 每頁顯示條數(shù)
    limit: pageSize
})
// sort : -1 => desc , a => asc

count

count方法用來統(tǒng)計符合條件的文檔集合的總數(shù)

Model.count(conditions, [callback])

update

Model.update(conditions, update, [options], [callback])
//查找并更新
Model.findByIdAndUpdate(id, [update], [options], [callback])
Model.findOneAndUpdate([conditions], [update], [options], [callback])

save

save是一個實例方法,使用時需要先 new Model() 來獲取實例

const article = new Article({
    //字段 => value
    //...ss
})

yield article.save()

remove

Model.remove(conditions, [callback])
//查找并刪除
Model.findByIdAndRemove(id, [options], [callback])
Model.findOneAndRemove(conditions, [options], [callback])

小結(jié)

以上僅僅是對mongoose文檔最簡單的使用總結(jié),諸如 where 方法或者 對數(shù)組的操作都沒有包含其中,具體以官方文檔為主

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容