MongooseMongoDB 異步模型工具
Mongoose 是設(shè)計(jì)用于異步環(huán)境的 MongoDB 對(duì)象模型工具,支持 promises 和 callbacks。
概述
連接到 MongoDB
首先需要定義一個(gè)連接。如果應(yīng)用僅使用一個(gè)數(shù)據(jù)庫(kù),則使用mongoose.connect。如果需要?jiǎng)?chuàng)建其他連接,請(qǐng)使用mongoose.createConnection。
connect 和 createConnection都使用 mongodb://URI,或者 host, database, port, options參數(shù)。
await mongoose.connect('mongodb://localhost/my_database');
連接后,open將在Connection實(shí)例上觸發(fā)該事件。
注意: 如果本地連接失敗,請(qǐng)嘗試使用 127.0.0.1 而不是 localhost,更改本地主機(jī)名可能會(huì)出現(xiàn)問(wèn)題。
Mongoose 會(huì)緩沖所有命令,直到它連接到數(shù)據(jù)庫(kù),這意味著不必等到它連接到 MongoDB 才開(kāi)始定義模型、運(yùn)行查詢。
定義模型
模型是通過(guò) Schema 接口定義的:
const Schema = mongoose.Schema;
const ObjectId = Schema.ObjectId;
const BlogPost = new Schema({
author: ObjectId,
title: String,
body: String,
date: Date
});
除了定義文檔的結(jié)構(gòu)和存儲(chǔ)的數(shù)據(jù)類型之外,Schema 還處理以下定義:
以下是上述功能的一些用法:
const Comment = new Schema({
name: { type: String, default: 'hahaha' },
age: { type: Number, min: 18, index: true },
bio: { type: String, match: /[a-z]/ },
date: { type: Date, default: Date.now },
buff: Buffer
});
// a setter
Comment.path('name').set(function (v) {
return capitalize(v);
});
// middleware
Comment.pre('save', function (next) {
notify(this.get('email'));
next();
});
查看examples/schema/schema.js示例中的典型設(shè)置端到端示例。
訪問(wèn)模型
一旦我們通過(guò) mongoose.model('ModelName', mySchema)定義了一個(gè)模型,就可以通過(guò)相同的函數(shù)訪問(wèn)它:
const MyModel = mongoose.model('ModelName');
或者一次性完成:
const MyModel = mongoose.model('ModelName', mySchema);
第一個(gè)參數(shù)是模型所針對(duì)的集合的單數(shù)名稱。Mongoose 會(huì)自動(dòng)查找模型名稱的復(fù)數(shù)形式。例如:
const MyModel = mongoose.model('Ticket', mySchema);
Mongoose 會(huì)為 tickets 集合建立模型,而不是 ticket 集合。
一旦我們有了模型,就可以實(shí)例化并保存它:
const instance = new MyModel();
instance.my.key = 'hello';
instance.save(function (err) {
//
});
可以從同一個(gè)集合中找到文檔
MyModel.find({}, function (err, docs) {
// docs.forEach
});