Schema: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
Model: 由Schema编译而成的假想(fancy)构造器,具有抽象属性和行为。Model的每一个实例(instance)就是一个document
。document
可以保存到数据库和从数据库返回。
Instance: 由Model创建的实例。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
mongoose中任何任何事物都是从Schema开始的。每一个Schema对应MongoDB中的一个集合(collection)。Schema中定义了集合中文档(document)的样式。
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
}
});
如果之后想要在Schema中添加键,可以使用Schema#add
方法。
为了使用schema定义,我们需要转换blogSchema
为一个Model
。使用mongoose.model(modelName, schema)
。
var BlogModel = mongoose.model('Blog', blogSchema);
// 开始吧!
Model
的实例是document
。实例有很多内置的方法,我们也可以给实例自定义方法。
var animalSchema = new Schema({ name: String, type: String });
animalSchema.methods.findSimilarTypes = function (cb) {
return this.model('Animal').find({ type: this.type }, cb);
}
现在所有的动物实例有findSimilarTypes
方法。
var AnimalModel = mongoose.model('Animal', animalSechema);
var dog = new AnimalModel({ type: 'dog' });
dog.findSimilarTypes(function (err, dogs) {
console.log(dogs); // woof
});
重写一个默认的实例方法可能会导致不期待的结果。
给Model
添加一个静态方法也是简单的。
animalSchema.statics.findByName = function (name, cb) {
this.find({ name: new RegExp(name, 'i') }, cb);
}
var AnimalModel = mongoose.model('Animal', animalSchema);
AnimalModel.findByName('fido', function (err, animals) {
console.log(animals);
});
区别就是一个给Model
添加方法(statics
),一个给实例添加方法(methods
)。下面是stackOverflow的两个答案。
答案一
答案二
MongoDB
支持二级索引,定义索引有两种方式
var animalSchema = new Schema({
name: String,
type: String,
tags: { type: [String], index: true } // field level
});
animalSchema.index({ name: 1, type: -1 }); // schema level, 1是正序,-1是倒序
如果要建立复合索引的话,在schema级别建立是必要的。
索引或者复合索引能让搜索更加高效,默认索引就是主键索引ObjectId,属性名为_id
。
数据库中主要的就是CRUD操作,建立索引可以提高查询速度。但是过多的索引会降低CUD操作。深度好文如下
http://www.cnblogs.com/huangxincheng/archive/2012/02/29/2372699.html