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的更多相关文章

  1. [译]Mongoose指南 - Schema

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

  2. [译]Mongoose指南 - Connection

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

  3. [译]Mongoose指南 - 验证

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

  4. [译]Mongoose指南 - 查询

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

  5. [译]Mongoose指南 - Model

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

  6. [译]Mongoose指南 - Plugin

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

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

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

  8. [译]Mongoose指南 - Document

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

  9. (译)快速指南:用UIViewPropertyAnimator做动画

    翻译自:QUICK GUIDE: ANIMATIONS WITH UIVIEWPROPERTYANIMATOR 译者:Haley_Wong iOS 10 带来了一大票有意思的新特性,像 UIViewP ...

随机推荐

  1. CodeForces 125E MST Company

    E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...

  2. ApkTool反编译apk,去除广告或者汉化后重新打包apk,并签名

    http://my.oschina.net/mopidick/blog/135581 以ubuntu的环境为例子,window的大同小异 首先下载apktool工具:https://code.goog ...

  3. MySQL安装问题

    win8.1安装mysql5.6时遇到问题,主要出现最后一步配置卡在了start server这一步会弹窗配置时间过长. 在网上查找方式并尝试之后都不能解决问题,尝试了卸载软件,清理注册表中的mysq ...

  4. python标准模块(二)

    本文会涉及到的模块: json.pickle urllib.Requests xml.etree configparser shutil.zipfile.tarfile 1. json & p ...

  5. wpf的毛边窗体效果 前台代码

    <Window x:Class="wpfwindowsmove.毛边窗体"        xmlns="http://schemas.microsoft.com/w ...

  6. 日志分析 第七章 安装grafana

    grafana依赖mysql存储数据,首先需要安装mysql 安装mysql 解压 # groupadd mysql # useradd -s /sbin/nologin -g mysql mysql ...

  7. win7搭建web服务器

    首先找到安装的tomcat软件,打开里面的webapp文件夹,在里面新建一个文件夹用作web应用程序访问端地址,然后再到新建的文件夹test里放入想要被访问的东西,这里我用的是一个测试的页面test. ...

  8. Java引用机制——reference

    所谓引用传递就是指将堆内存空间的使用权交给多个栈内存空间. 例子<1> public class Aliasing { int temp = 30; public static void ...

  9. CSS学习笔记——CSS选择器样式总结

    <style type="text/css"> * { padding:0; margin:0; } .box h2 { //内边距左边的距离 padding-left ...

  10. Eclipse 安装svn插件及使用

    1 安装 参考:http://welcome66.iteye.com/blog/1845176 通过svn插件安装,地址: Links for 1.8.x Release: Eclipse updat ...