Mongoose前端
》Schema
Mongoose 的一切始於 Schema。每一個 schema 都會映射到一個 MongoDB collection ,並定義這個collection裏的文檔的構成。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
在這以後你還想添加 keys 的話, 請使用 Schema#add 方法。
容許使用的 SchemaTypes 有:
String
Number
Date
Buffer
Boolean
Mixed
ObjectId
Arraymongodb
SchemaType
指定字段約束,不一樣的SchemaType類型還有其餘不一樣的屬性配置
var schema2 = new Schema({
test: {
type: String,
lowercase: true // Always convert `test` to lowercase
}
});
經常使用可配參數有:
required: 必選驗證器。
default: 默認值。Any或function,若是該值是一個函數,則該函數的返回值將用做默認值。
select: boolean值, 指定是否被投影
validate: 驗證器
alias: 別名。
其餘類型特有屬性官方API查找。數據庫
since index creation can cause a significant performance impact. Disable the behavior by setting the autoIndex option of your schema to false, or globally on the connection by setting the option autoIndex to false.json
mongoose.connect('mongodb://user:pass@localhost:port/database', { autoIndex: false }); //真心推薦
// or
mongoose.createConnection('mongodb://user:pass@localhost:port/database', { autoIndex: false });
// or
animalSchema.set('autoIndex', false);
// or
new Schema({..}, { autoIndex: false });promise
schema還能夠添加一些Options:
option: id
Mongoose 會默認生成一個虛擬值 id,指向文檔的 _id 字段。 若是你不須要 id 虛擬值,能夠經過這個選項禁用此功能。
option: _id
Mongoose 默認給你的 Schema 賦值一個 _id。 這個值的類型是 ObjectId,這與MongoDB的默認表現一致。 若是你不須要 _id,能夠經過這個選項禁用此功能。
option: strict
Strict 選項默認爲 true,這意味着你不能 save schema 裏沒有聲明的屬性。
還能夠設置轉字符串時的一些參數:
schema.set('toJSON', { getters: true, virtuals: false });
schema.set('toObject', { getters: true });緩存
》connction
咱們能夠經過利用mongoose的connect()方法鏈接到MongoDB 。
mongoose.connect('mongodb://localhost/myapp');
這是在默認端口(27017)鏈接到在本地運行的myapp數據庫的最低須要。app
咱們也能根據你的環境指定URI中的幾個參數,詳細看MongoDB鏈接字符串格式。
mongoose.connect('mongodb://username:password@host:port/database?options...');
mongoose.connect('mongodb://test:1234@ip:port/test', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(()=>{
response.end("connected!");
mongoose.connection.close();
}).catch((e)=>{
response.end("error!"+e);
});socket
要鏈接到副本集,你能夠用逗號分隔,傳入多個地址
mongoose.connect('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]' [, options]);
鏈接多個 mongos(MongoDB Shard)分片集羣的實例。在 mongoose 5.x 中不須要傳入任何特殊選項。
// Connect to 2 mongos servers
mongoose.connect('mongodb://mongosA:27501,mongosB:27501', cb);async
多個鏈接
有時候咱們須要多個鏈接,例如權限不一樣,或是鏈接到不一樣數據庫。這個狀況下咱們可使用 mongoose.createConnection(), 它接受以前提到的全部參數,給你返回一個新的鏈接。
const conn = mongoose.createConnection('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]', options);
connection 對象後續用於建立和檢索 models。 models 的範圍老是侷限於單個鏈接。mongoose
調用 mongoose.connect() 時,Mongoose 會自動建立默認鏈接。 你可使用 mongoose.connection 訪問默認鏈接。
Options
connect方法還接收一個option對象,該對象將被傳遞給底層驅動程序,能夠傳一些Mongo底層驅動的參數或mongoose本身的參數。這裏的全部選項優先於鏈接字符串傳遞的選項。
mongoose.connect(uri, options);
可設置的有:
poolSize - MongoDB 保持的最大鏈接池的鏈接數。 poolSize 的默認值是 5。
autoIndex - 默認狀況下,mongoose 在鏈接時會自動創建 schema 的索引,這可能致使長時間阻塞,建議設置爲false。
user/pass - 用於認證的用戶名和密碼
bufferCommands - Mongoose會緩存全部命令直到鏈接上數據庫,這意味着你沒必要等待它鏈接MongoDB再定義 models,執行 queries 等。這個操做很方便,但也回引發一些疑惑, 由於若是你沒連上 ,Mongoose 不會 拋錯。要禁用緩存,請修改 bufferCommands 配置,也能夠全局禁用 bufferCommands :
mongoose.set('bufferCommands', false);
bufferMaxEntries - MongoDB 驅動一樣有本身的離線時緩存機制。若是你但願連接錯誤時終止數據庫操做,請將此選項設爲 0 以及把 bufferCommands 設爲 false 。
connectTimeoutMS - 鏈接超時時間
keepAlive - 保活時間
const options = {
user: "test",
pass: "1234"
autoIndex: false, // Don't build indexes
poolSize: 10, // Maintain up to 10 socket connections
bufferCommands: false,
bufferMaxEntries: 0 // If not connected, return errors immediately rather than waiting for reconnect
};
mongoose.connect(uri, options);
connect函數能夠傳入回調方法 function(error),或者返回promise寫成then形式:
mongoose.connect(uri, options).then(
() => { /** ready to use. The `mongoose.connect()` promise resolves to undefined. */ },
err => { /** handle initial connection error */ }
);
》model
Models 是從 Schema 編譯來的構造函數。 它們的實例就表明着能夠從數據庫保存和讀取的 documents。 從數據庫建立和讀取 document 的全部操做都是經過 model 進行的。
使用默認的connection把 schema 編譯爲一個 Model: mongoose.model(modelName, schema)
使用自定義的connection把 schema 編譯爲一個 Model: connection.model(modelName, schema)
var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Car = mongoose.model('Car', schema);
注意: mongoose.model裏面定義的第一個參數,好比’Car’,實際上在db中的collection是’Cars’。要解決這種混淆,能夠在建立Schema時明確設置collection名稱:
var schema = new mongoose.Schema({ name: 'string', size: 'string' },{collection:'Car'} );
>有了Model,則能夠建立文檔、操做文檔:
var small = new Car({ size: 'small' });
small.save(function (err) {
if (err) return handleError(err);
// saved!
})
// 或者
Car.create({ size: 'small' }, function (err, small) {
if (err) return handleError(err);
// saved!
})
要注意,直到 model 使用的數據庫鏈接( connection )被打開,small 文檔纔會被建立/刪除。
>查詢
mongoose支持 MongoDB 的查詢語法,即直接使用find/findOne並傳入json格式的查詢條件(可回調或promise的then處理結果),或者用 model 簡單封裝 findById、where 這些靜態方法。
Mongoose 中每一處查詢,被傳入的回調函數都遵循 callback(error, result) 這種模式。查詢結果的格式取決於作什麼操做: findOne() 是單個文檔(有多是 null ),find() 是文檔列表, count() 是文檔數量,update() 是被修改的文檔數量。
Tank.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec(callback);
Tank.findById(id, function (err, tank) {
if (err) return handleError(err);
tank.size = 'large'; // 更新操做,直接操做對象便可,或者用 tank.set({ size: 'large' });
tank.save(function (err, updatedTank) {
if (err) return handleError(err);
res.send(updatedTank);
});
});
這個方法先檢索數據,接着更新(使用了 save)。 若是咱們僅僅須要更新而不須要獲取該數據, Model#update 就很適合咱們:
Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);
若是咱們確實須要返回文檔,這個方法更適合:
Tank.findByIdAndUpdate(id, { $set: { size: 'large' }}, { new: true }, function (err, tank) {
if (err) return handleError(err);
res.send(tank);
});
增刪改查
;(async ()=>{
//查
var t = await studentModel.find({})
//改 //注意! : 若使用 xxx.save() 則只有 schema 聲明過的對象才能經過對應的 setter 傳遞值進入 xxx._doc.xxx.value
await studentModel.update({_id:"ae86"},{$set:{username:"newwww"}})
//增
await studentModel.create({ username:'test',phone:'110'})
//刪除
await studentModel.remove({phone:'110'})
//$lt"(小於),"$lte"(小於等於),"$gt"(大於),"$gte"(大於等於),"$ne"(不等於)
await userMode.find({"age": {"$lt": 18}})
//簡單分頁查詢
Model.find({}).sort({'_id':-1}).skip(page * 5).limit(5)
//複雜分頁查詢 要求前端返回一個 ObjectId
if (id) {
return Model.find({{'_id': {"$lt": id}}).sort({'_id':-1}).skip(page * 5).limit(5)
}else {
return Model.find({}).sort({'_id':-1}).skip(page * 5).limit(5)
}
//關閉鏈接
mongoose.connection.close()
})()
防止函數聲明式調用失效把( function a( ){ })()改寫爲;( function a( ) { })() 比較好,加一個分號防止上一行結尾沒有分號致使的編譯歧義