定义schema

用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构.

var mongoose = require('mongoose');
var schema = mongoose.Schema; var blogSchema = new Schema({
titile: String,
body: String,
comments: [{body: String, date: Date}],
date: {type: Date, default: Date.now},
hidden:Boolen
});

创建model

格式是mongoose.model(modelName, schema);

var BlogModel = mongoose.model('Blog', blogSchema);

实例化方法

model的实例是document. document有许多内置的实例方法. 我们可以为document定义自己的实例方法

var animalSchema = new Schema({name: String, type: String});

//定义实例方法
animalSchema.methods.findSimilarType = function(cb){
return this.model('Animal').find({type: this.type}, cb);
}

现在animal实例有findSimilarTypes方法了

var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({type: 'dog'}); dog.findSimilarTypes(function(err, dogs){
console.log(dogs);
});

Model静态方法

还可以给Model添加静态方法

animalSchema.statics.findByName = function(name, cb){
this.find({name: new RegExp(name, 'i')}, cb);
} var Animal = mongoose.model('Animal', animalSchema); Animal.findByName('fido', function(err, animals){
console.log(animals);
});

索引

索引分为field级别和schema级别. 如果使用复合索引那么必须使用schema索引

var animalSchema = new Schema({
name: String,
type: String,
tags: {type: [String], index:true} // field level
}); animalSchema.index({name:1, type:-1}); // schema level

当应用启动的时候, mongoose会自动为你的schema调用ensureIndex确保生成索引. 开发环境用这个很好, 但是建议在生产环境不要使用这个.使用下面的方法禁用ensureIndex

animalSchema.set('autoIndex', false);
//or
new Schema({}, {autoIndex: false});

Virtual

virtual是document的属性 你可以get,set他们但是不持续化到MongoDB. virtual属性get非常有用可以格式化或者合并字段,  set可以分解一个字段到多个字段并持续化到数据库

var personSchema = new Schema({
name: {
first: String,
last: String
}
}); var Person = mongoose.model('Person', personSchema); var bad = new Person({
name: {first: 'Walter', last: 'White'}
});

如果你想获取bad的全名 你需要这样做

console.log(bad.name.first + ' ' + bad.name.last);

或者我们可以在personSchema中定义virtual getter. 这样我们就不需要在每个要用fullname的地方拼接字符串了

personSchema.virtual('name.full').get(function(){
return this.name.first + ' ' + this.name.last;
);

现在我么可以使用 name.full虚属性了

console.log(bad.name.full);

我们还可以通过设置this.name.full来设置this.name.first和this.name.last

bad.name.full = "Breaking Bad";
personSchema.virtual('name.full').set(function(name){
var split = name.split(' ');
this.name.first = split[0];
this.name.last = split[1];
}); mad.name.full = "Breaking Bad";
console.log(mad.name.first); // Breaking
console.log(mad.name.last); // Bad

  

Options

Schema有一些配置选项, 可以如下面一样设置

new Schema({}, options);

//or
var xxSchema = new Schema({});
xxSchema.set(option, value);

option:autoIndex

应用启动的时候Mongoose会自动为每一个schema发送一个ensureIndex命令。  如果你想禁止自动创建index要自己手动来创建的话 你可以设置autoIndex为false

var xxSchema = new Schema({}, { autoIndex: false });

var Clock = mongoose.model('Clock', xxSchema);
Clock.ensureIndexs(callback);

option:bufferCommands

todo

var schema = new Schema({}, { bufferCommands: false });

option:capped

todo

....

[译]Mongoose指南 - Schema的更多相关文章

  1. [译]Mongoose指南 - Population

    MongoDB没有join, 但是有的时候我们需要引用其它collection的documents, 这个时候就需要populate了. 我们可以populate单个document, 多个docum ...

  2. 85.Mongoose指南 - Schema

    转自:https://www.bbsmax.com/A/pRdBnKpPdn/ 定义schema 用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的 ...

  3. [译]Mongoose指南 - 验证

    开始前记住下面几点 Validation定义在SchemaType中 Validation是一个内部的中间件 当document要save前会发生验证 验证不会发生在空值上 除非对应的字段加上了 re ...

  4. [译]Mongoose指南 - Model

    编译你的第一个model var xxSchema = new Schema({name: 'string', size: 'string'}); var Tank = mongoose.model( ...

  5. [译]Mongoose指南 - Connection

    使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb ...

  6. [译]Mongoose指南 - Plugin

    Schema支持插件, 这样你就可以扩展一些额功能了 下面的例子是当document save的时候自定更新最后修改日期的出插件 // lastMod.js module.exports = expo ...

  7. [译]Mongoose指南 - 中间件

    中间件是一些函数, 当document发生init, validate, save和remove方法的时候中间件发生. 中间件都是document级别的不是model级别的. 下面讲讲两种中间件pre ...

  8. [译]Mongoose指南 - 查询

    查询有带callback和不带callback两种方式 所有mongoose的callback都是这种格式: callback(err, result) var Person = mongoose.m ...

  9. [译]Mongoose指南 - Document

    更新 有几种方式更新document. 先看一下传统的更新方法 Tank.findById(id, function(err, tank){ if(err) return handleError(er ...

随机推荐

  1. 一款可以下拉搜索html下拉框控件

    直接上图,组件不错,支持静态和动态搜索,这个只是在原控件上自己修改样式后的,这里主要记录一下,在修改别人控件时,应该如何去封装代码: 原控件:http://ivaynberg.github.com/s ...

  2. hdu 4403 dfs

    巨麻烦的模拟题orz.... 先确定等号的位置,然后两层dfs,分别算等号前面的和后面的,再比较 话说这题竟然不开long long都能水过 #include <iostream> #in ...

  3. hdu 2031 杨辉三角

    题意:显示杨辉三角形. 解法: 组合数学公式:combi(n,m)=combi(n-1,m-1)+combi(n-1,m); 至于为什么有这个公式呢?那就是高中数学的内容啦 1: #include&l ...

  4. chrome使用技巧

    chrome使用技巧 chrome对于开发人员来说,绝对是一个神器.下面,介绍关于它的一些小技巧: 1.利用chrome快速定位source中的资源. 我之前一般如果查找每个文件,都是打开控制台,在s ...

  5. 机器学习笔记—Logistic回归

    本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...

  6. Json对象与Json字符串互转(转载)

    一.jQuery插件支持的转换方式 1 $.paseJSON(jsonstr);//将json字符串转换为json对象 二.浏览器支持的转换方式(Firefox,Chrome,Opera,Safair ...

  7. 怎样用命令行编译C#程序

    1. 把程序拷贝至记事本 2.另存为*cs格式 3.找到VS2015提供的命令提示 4.要把命令行指向程序所在的目录(可以有个小软件) 如果在其他的盘符,先敲D:,然后再cd 5.输入csc hell ...

  8. js013-事件

    js013-事件 本章内容 理解事件流 使用时间处理程序 不同的事件类型 JS与HTML之间的交互是通过实践实现的.时间就还文档或浏览器窗口发生的一些特定的交互 瞬间.可以使用侦听器来预定事件,以便时 ...

  9. spring boot properties

    [转载] 代码从开发到测试要经过各种环境,开发环境,测试环境,demo环境,线上环境,各种环境的配置都不一样,同时要方便各种角色如运维,接口测试, 功能测试,全链路测试的配置,hardcode 肯定不 ...

  10. 兼容ie6及一下版本的自适应

    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1" /> <meta ...