Mongoose.js:强制总是填充

Posted

技术标签:

【中文标题】Mongoose.js:强制总是填充【英文标题】:Mongoose.js: force always populate 【发布时间】:2014-03-02 18:36:38 【问题描述】:

有没有办法指示模型总是填充某个字段?

类似于在任何查找查询中填充“字段”:

field: Schema.ObjectId, ref: 'Ref', populate: true

?

【问题讨论】:

虽然这听起来像是一个有用的功能,但我不确定您是否真的希望在架构级别使用此选项。通过应用此选项,您将永远无法获取存储在集合中的原始 ObjectId,因此这会使更新和保存文档变得困难。 Mongoose 足够聪明,可以在您保存时自动从填充的子对象中提取 ObjectId。 【参考方案1】:

在 Mongoose 4.0 中,您可以使用查询挂钩来自动填充您想要的任何内容。

以下示例来自 Valeri Karpov 的 introduction document。

模式定义:

var personSchema = new mongoose.Schema(
  name: String
);

var bandSchema = new mongoose.Schema(
  name: String,
  lead:  type: mongoose.Schema.Types.ObjectId, ref: 'person' 
);

var Person = mongoose.model('person', personSchema, 'people');
var Band = mongoose.model('band', bandSchema, 'bands');

var axl = new Person( name: 'Axl Rose' );
var gnr = new Band( name: "Guns N' Roses", lead: axl._id );

自动填充的查询钩子:

var autoPopulateLead = function(next) 
  this.populate('lead');
  next();
;

bandSchema.
  pre('findOne', autoPopulateLead).
  pre('find', autoPopulateLead);

var Band = mongoose.model('band', bandSchema, 'bands');

【讨论】:

【参考方案2】:

这个插件可以解决你的问题:

https://www.npmjs.com/package/mongoose-autopopulate

【讨论】:

此解决方案在 5.3.9 的 mongoose 文档中正式引用:mongoosejs.com/docs/populate.html【参考方案3】:

我使用查询挂钩来自动填充,但它不适用于 create()save() 修改字段。 这是我的代码:

var autoPopulate = function(next) 
  this.populate('updated_by','name').populate('created_by','name');
  next();
;

ProjectSchema.pre('findOne', autoPopulate);
ProjectSchema.pre('find', autoPopulate);

如果我更新 Project,则仅填充 created_by

如果我创建新的Projectcreated_byupdated_by 都不会被填充。

findfindOne 可以正常工作。

我应该怎么做才能始终填充created_byupdated_by

【讨论】:

我没有尝试过,但我认为您可能需要使用post 挂钩?也许在ProjectSchema.post('save', autoPopulate);的链接中有些东西 为了节省时间,您可以使用这个插件:npmjs.com/package/mongoose-autopopulate,它会在您的查询结果中添加整个引用文档数组...

以上是关于Mongoose.js:强制总是填充的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose JS - 填充方法不返回完整引用的对象... - 仅返回 objectId 版本

像使用 mongoose-paginate 的过滤器

在自动填充被破坏或禁用的站点上强制登录自动填充

Mongoose.js:删除集合或数据库

Mongoose.js:删除集合或数据库

Mongoose.js:删除集合或数据库