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()

  

时间: 2024-10-10 10:25:30

Mongoose指南 - Population的相关文章

Mongoose指南 - Connection

使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb的myapp数据库.我们还可以给url设定一些特定的参数: mongoose.conect('mongodb://username:[email protected]:port/databasename?options...'); Options connect方法可以接受一个options对象 m

Mongoose指南 - Schema

定义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,

Mongoose指南 - Model

编译你的第一个model var xxSchema = new Schema({name: 'string', size: 'string'}); var Tank = mongoose.model('Tank', schema); 构造document document是model的实例. 创建更新document到数据很容易 var Tank = mongoose.model('Tank', tankSchema); var small = new Tank({size:'small'});

Mongoose指南 - 查询

查询有带callback和不带callback两种方式 所有mongoose的callback都是这种格式: callback(err, result) var Person = mongoose.model('Person', yourSchema); Person.findOne({'name.last':'Ghost'}, 'name occupation', function(err, person){ if(err) return handleError(err); console.l

Mongoose指南 - 验证

开始前记住下面几点 Validation定义在SchemaType中 Validation是一个内部的中间件 当document要save前会发生验证 验证不会发生在空值上 除非对应的字段加上了 required validator 可以自定义验证器 内置的验证器 所有的SchemaType都有required验证器 Number有min和max验证器 String有enum和match验证器 自定义验证器 //确保值是something function validator(val){ ret

Mongoose指南 - Document

更新 有几种方式更新document. 先看一下传统的更新方法 Tank.findById(id, function(err, tank){ if(err) return handleError(err); tank.size = "large"; tank.save(function(err){ if(err) return handleError(err); res.send(tank); }); }); 上面的代码是先查找出一个dociment然后在更新. 如果我们不想查找doc

Mongoose指南 - Plugin

Schema支持插件, 这样你就可以扩展一些额功能了 下面的例子是当document save的时候自定更新最后修改日期的出插件 // lastMod.js module.exports = exports = function lastModifiedPlugin (schema, options) { schema.add({ lastMod: Date }) schema.pre('save', function (next) { this.lastMod = new Date next(

mongoose 文档(七) Population

在mongoose中没有join但有时我们仍然想引用其他collection的document,population由此而来. population是自动将document中指定path替换为其他collection的document的过程.我们能迁移document.多个document.简单对象.多个简单对象或者是查询返回的所有对象. var mongoose = require('mongoose') , Schema = mongoose.Schema var personSchema

mongoose 文档(四) queries

通过一些model的静态辅助方法可以检索document. 任何 涉及 指定 查询 条件的 model 方法都能通过两个方法执行. 当一个回调函数: 被传递,操作将立即执行,结果传给回调. 没有被传递,返回一个 查询 实例,它提供一个特殊的查询生成接口. 在mongoose 4,Query有 then()函数,因此可以被用来作为一个 promise. 用回调函数执行查询时,将请求指定为JSON 文档.JSON文档的语法和 MongoDB shell 一样. var Person = mongoo