[译]Mongoose指南 - Population
MongoDB没有join, 但是有的时候我们需要引用其它collection的documents, 这个时候就需要populate了.
我们可以populate单个document, 多个document, plain object, multiple plain objects或query返回的全部object.
var mongoose = require('mongoose');
var Schema = mongoose.Schema; var personSchema = new Schema({
_id: Number,
name: String,
age: Number,
stories: [{type: Schema.Types.ObjectId, ref: 'story'}]
}); var storySchema = new Schema({
_creator: {type: Number, ref: 'Person'},
title: String,
fans: [{type: Number, ref: 'Person'}]
}); var Story = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);
目前为止我们创建了两个model. Person model有一个stories字段是以个ObjectId的集合. ref是告诉mongoose哪个model应该被popluate.
Story有一个_creator字段是Number类型的他是personSchema的Id
Saving ref
保存一个ref
var arron = new Person({_id:0, name: 'Aaron', age: 100}); arron.save(function(err){
if(err) return handleError(err); var story1 = new Story({
titile: 'Once upon a timex',
_creator: arron._id //分配person的_id
}); story1.save(function(err){
if(err) return handleError(err);
}); });
Populate
填充story的_creator
Story
.findOne({title: 'Once upon a timex'})
.populate('_creator')
.exec(fucntion(err, story){
if(err) return handleError(err);
console.log(story._creator.name) // Aaron
});
Field selection
如果我们不想为story填充整个_creator 我们只想填充_creator的name怎么搞呢?
Story
.findOne({ title: /timex/i })
.populate('_creator', 'name') // only return the Persons name
.exec(function (err, story) {
if (err) return handleError(err); console.log('The creator is %s', story._creator.name);
// prints "The creator is Aaron" console.log('The creators age is %s', story._creator.age);
// prints "The creators age is null'
})
一次填充多个paths
如果我们想一次填充多个path怎么过搞呢
Story
.find(...)
.populate('fans author') // space delimited path names
.exec()
另一种写法
Story
.find(...)
.populate('fans')
.populate('author')
.exec()
按条件填充
Story
.find(...)
.populate({
path: 'fans',
match: { age: { $gte: 21 }},
select: 'name -_id',
options: { limit: 5 }
})
.exec()
[译]Mongoose指南 - Population的更多相关文章
- [译]Mongoose指南 - Schema
定义schema 用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构. var mongoose = require('mongoose'); ...
- [译]Mongoose指南 - Connection
使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb ...
- [译]Mongoose指南 - 验证
开始前记住下面几点 Validation定义在SchemaType中 Validation是一个内部的中间件 当document要save前会发生验证 验证不会发生在空值上 除非对应的字段加上了 re ...
- [译]Mongoose指南 - 查询
查询有带callback和不带callback两种方式 所有mongoose的callback都是这种格式: callback(err, result) var Person = mongoose.m ...
- [译]Mongoose指南 - Model
编译你的第一个model var xxSchema = new Schema({name: 'string', size: 'string'}); var Tank = mongoose.model( ...
- [译]Mongoose指南 - Plugin
Schema支持插件, 这样你就可以扩展一些额功能了 下面的例子是当document save的时候自定更新最后修改日期的出插件 // lastMod.js module.exports = expo ...
- [译]Mongoose指南 - 中间件
中间件是一些函数, 当document发生init, validate, save和remove方法的时候中间件发生. 中间件都是document级别的不是model级别的. 下面讲讲两种中间件pre ...
- [译]Mongoose指南 - Document
更新 有几种方式更新document. 先看一下传统的更新方法 Tank.findById(id, function(err, tank){ if(err) return handleError(er ...
- (译)快速指南:用UIViewPropertyAnimator做动画
翻译自:QUICK GUIDE: ANIMATIONS WITH UIVIEWPROPERTYANIMATOR 译者:Haley_Wong iOS 10 带来了一大票有意思的新特性,像 UIViewP ...
随机推荐
- hdu3932 模拟退火
模拟退火绝对是从OI--ACM以来接触过的所有算法里面最黑科技的orz 题意:地上有一堆hole,要找一个点,使得(距离该点最远的hole的距离)最小. sol:本来想套昨天的模拟退火模板,初值(0, ...
- FZU 2191 完美的数字
题目链接: 传送门 完美的数字 Time Limit: 1000MS Memory Limit: 65536K 题目描述 Bob是个很喜欢数字的孩子,现在他正在研究一个与数字相关的题目,我们知 ...
- BZOJ3506/1502 [CQOI2014]排序机械臂
传送门 依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...
- excel2013添加坐标轴名称label
图画好了,x.y轴没有名称,怎么办那 点击左上角有个---添加图标元素----里面有轴标题应该就是
- 条件运算符(?:)和 $""替代string.Format()
1. 条件运算符(?:)根据Boolean表达式的值返回两个值之一.表达式如下: condition ? first_expression : second_expression 2. $" ...
- 20145212《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDE)
20145212<Java程序设计>实验报告一:Java开发环境的熟悉(Windows+IDE) 实验内容及步骤 1.命令行下的JAVA程序开发 建立并进入实验目录: 撰写简单的Hello ...
- Python学习笔记——基本语法
1.程序输出——print语句 >>> myString = 'Hello World!' >>> print myString Hello World! > ...
- Java排序算法——快速排序
import java.util.Arrays; //================================================= // File Name : Arrays_Q ...
- JavaScript学习笔记——流程控制
javascript流程控制流程:就是程序代码的执行顺序.流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行. 一.顺序结构 按照书写顺序来执行,是程序中最基本的流程结构. 二.选择结构(分 ...
- ajax传输 基础一
一个简单页面的传输 index.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...