developer.mozilla.org/en-US/docs/…
Web App 的 M组件开发
1 开发的第一步,当然是概念模型的设计
L 业务对象的ER图
2 第二是,为所有的 业务对象数据模型 创建 mongoose 的文档格式(schema)定义
L 一个对象,一个schema定义
3 为了更好的理解,我们可从反向——代码开发的角度看 这个过程 所需要的开发任务 (queries -> model -> schema -> connecting -> db setup)
L 同时,看mongoose提供什么API 工具
4 从代码的角度,我们需要一个可以增加数据持久化(增删改查)的「JS对象」
L 例如如下的,一个notes 数组,我们想取得所有note
E 这个「JS对象」是个什么类型的对象?
export const renderNotes = async (req, res) => {
const notes = await Note.find({ user: req.user.id })
.sort({ date: "desc" })
.lean();
res.render("notes/all-notes", { notes });
};
5 为了取得文档(上面的集合)数据,我们得先创建一个 对象模型实例,例如
let EmailModel = require('./email')
let msg = new EmailModel({
email: 'ada.lovelace@gmail.com'
})
/express-locallibrary-tutorial //the project root
/models
author.js
book.js
bookinstance.js
genre.js
Author model (./models/author.js )
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var AuthorSchema = new Schema(
{
first_name: {type: String, required: true, maxLength: 100},
family_name: {type: String, required: true, maxLength: 100},
date_of_birth: {type: Date},
date_of_death: {type: Date},
}
);
// Virtual for author's full name
AuthorSchema
.virtual('name')
.get(function () {
return this.family_name + ', ' + this.first_name;
});
// Virtual for author's lifespan
AuthorSchema
.virtual('lifespan')
.get(function () {
return (this.date_of_death.getYear() - this.date_of_birth.getYear()).toString();
});
// Virtual for author's URL
AuthorSchema
.virtual('url')
.get(function () {
return '/catalog/author/' + this._id;
});
//Export model
module.exports = mongoose.model('Author', AuthorSchema);
Book
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var BookSchema = new Schema(
{
title: {type: String, required: true},
author: {type: Schema.Types.ObjectId, ref: 'Author', required: true},
summary: {type: String, required: true},
isbn: {type: String, required: true},
genre: [{type: Schema.Types.ObjectId, ref: 'Genre'}]
}
);
// Virtual for book's URL
BookSchema
.virtual('url')
.get(function () {
return '/catalog/book/' + this._id;
});
//Export model
module.exports = mongoose.model('Book', BookSchema);
BookInstance
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var BookInstanceSchema = new Schema(
{
book: { type: Schema.Types.ObjectId, ref: 'Book', required: true }, //reference to the associated book
imprint: {type: String, required: true},
status: {type: String, required: true, enum: ['Available', 'Maintenance', 'Loaned', 'Reserved'], default: 'Maintenance'},
due_back: {type: Date, default: Date.now}
}
);
// Virtual for bookinstance's URL
BookInstanceSchema
.virtual('url')
.get(function () {
return '/catalog/bookinstance/' + this._id;
});
//Export model
module.exports = mongoose.model('BookInstance', BookInstanceSchema);
Genre model - challenge!
Open your ./models/genre.js file and create a schema for storing genres (the category of book, e.g. whether it is fiction or non-fiction, romance or military history, etc).
The definition will be very similar to the other models:
- The model should have a
StringSchemaType callednameto describe the genre. - This name should be required and have between 3 and 100 characters.
- Declare a virtual for the genre's URL, named
url. - Export the model.