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ù)組的操作都沒有包含其中,具體以官方文檔為主