85.Mongoose指南 - Schema
转自:https://www.bbsmax.com/A/pRdBnKpPdn/
定义schema
用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构.
|
1
2
3
4
5
6
7
8
9
10
|
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);
|
1
|
var BlogModel = mongoose.model('Blog', blogSchema); |
实例化方法
model的实例是document. document有许多内置的实例方法. 我们可以为document定义自己的实例方法
|
1
2
3
4
5
6
|
var animalSchema = new Schema({name: String, type: String});//定义实例方法animalSchema.methods.findSimilarType = function(cb){ return this.model('Animal').find({type: this.type}, cb);} |
现在animal实例有findSimilarTypes方法了
|
1
2
3
4
5
6
|
var Animal = mongoose.model('Animal', animalSchema);var dog = new Animal({type: 'dog'});dog.findSimilarTypes(function(err, dogs){ console.log(dogs);}); |
Model静态方法
还可以给Model添加静态方法
|
1
2
3
4
5
6
7
8
9
10
|
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索引
|
1
2
3
4
5
6
7
|
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
|
1
2
3
|
animalSchema.set('autoIndex', false);//ornew Schema({}, {autoIndex: false}); |
Virtual
virtual是document的属性 你可以get,set他们但是不持续化到MongoDB. virtual属性get非常有用可以格式化或者合并字段, set可以分解一个字段到多个字段并持续化到数据库
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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的全名 你需要这样做
|
1
|
console.log(bad.name.first + ' ' + bad.name.last); |
或者我们可以在personSchema中定义virtual getter. 这样我们就不需要在每个要用fullname的地方拼接字符串了
|
1
2
3
|
personSchema.virtual('name.full').get(function(){ return this.name.first + ' ' + this.name.last; ); |
现在我么可以使用 name.full虚属性了
|
1
|
console.log(bad.name.full); |
我们还可以通过设置this.name.full来设置this.name.first和this.name.last
|
1
|
bad.name.full = "Breaking Bad"; |
|
1
2
3
4
5
6
7
8
9
10
11
|
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); // Breakingconsole.log(mad.name.last); // Bad |
Options
Schema有一些配置选项, 可以如下面一样设置
|
1
2
3
4
5
|
new Schema({}, options);//orvar xxSchema = new Schema({});xxSchema.set(option, value); |
option:autoIndex
应用启动的时候Mongoose会自动为每一个schema发送一个ensureIndex命令。 如果你想禁止自动创建index要自己手动来创建的话 你可以设置autoIndex为false
|
1
2
3
4
|
var xxSchema = new Schema({}, { autoIndex: false });var Clock = mongoose.model('Clock', xxSchema);Clock.ensureIndexs(callback); |
option:bufferCommands
todo
|
1
|
var schema = new Schema({}, { bufferCommands: false }); |
option:capped
todo
....
85.Mongoose指南 - Schema的更多相关文章
- [译]Mongoose指南 - Schema
定义schema 用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构. var mongoose = require('mongoose'); ...
- [译]Mongoose指南 - Population
MongoDB没有join, 但是有的时候我们需要引用其它collection的documents, 这个时候就需要populate了. 我们可以populate单个document, 多个docum ...
- [译]Mongoose指南 - 验证
开始前记住下面几点 Validation定义在SchemaType中 Validation是一个内部的中间件 当document要save前会发生验证 验证不会发生在空值上 除非对应的字段加上了 re ...
- [译]Mongoose指南 - Model
编译你的第一个model var xxSchema = new Schema({name: 'string', size: 'string'}); var Tank = mongoose.model( ...
- mongoose 建立schema 和model
在node中使用MongoDB很多情况下,都是使用mongoose的,所以这集来介绍一下 安装 yarn add mongoose 连接 const mongoose = require(" ...
- [译]Mongoose指南 - Connection
使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb ...
- [译]Mongoose指南 - Plugin
Schema支持插件, 这样你就可以扩展一些额功能了 下面的例子是当document save的时候自定更新最后修改日期的出插件 // lastMod.js module.exports = expo ...
- [译]Mongoose指南 - 中间件
中间件是一些函数, 当document发生init, validate, save和remove方法的时候中间件发生. 中间件都是document级别的不是model级别的. 下面讲讲两种中间件pre ...
- [译]Mongoose指南 - 查询
查询有带callback和不带callback两种方式 所有mongoose的callback都是这种格式: callback(err, result) var Person = mongoose.m ...
随机推荐
- jsoup抓取网页+具体解说
jsoup抓取网页+具体解说 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目.我以前在 IBM DW 上发表过两篇关于 htmlparser 的文章.各自 ...
- Android笔记三十三.BroadcastReceiver使用
广播是一种广泛运用在应用程序之间传输信息的机制,而BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件. BroadcastReceiver本质上是一种全局监听器. ...
- zzuoj--10401--物资调度(dfs)
A.物资调度 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 93 Solved: 52 [Submit][Status][Web Board] De ...
- http协议无状态中的 "状态" 到底指的是什么?!(转载)
转载自:https://www.cnblogs.com/bellkosmos/p/5237146.html 引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无 ...
- 07:清泉-改(prime+堆)
时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 512000kB 描述 华北电力大学可以抽象为一张有n个点m条边的无向图. 现在所有的边都断了. 修复每条边都有个不同 ...
- Eclipse安装Web插件
方法/步骤 本次安装教程,我把所有的步骤都写在了图片中,大家仔细查看图片即可,希望能帮到大家 1.选择菜单栏上的“Help” 选择Install New Software 在弹出的 ...
- 死锁,线程协作(同步,阻塞队列,Condition,管道流)
synchronized死锁 package com.thread.demo.deadlock; public class DeadLock { private static Object lock1 ...
- 基本数据类型(list、tuple)
1.列表 1.1 定义 li=[1,2,3] 每个元素逗号隔开 list("abc") 迭代 列表是一个容器 => 任意类型 列表是有序的 => 索引 切片 步长 列表 ...
- 【BZOJ4448】【SCOI2015】情报传递
这题面错别字真tm多 题意: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有若T名(可能没有)下线,除1名大头日外其余n-1 ...
- 单机Mongo复制集安装配置(数据库版本:4.x)
官方文档: https://docs.mongodb.com/manual/tutorial/deploy-replica-set-with-keyfile-access-control/#dep ...