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
如果我创建新的Project
,created_by
和 updated_by
都不会被填充。
find
和 findOne
可以正常工作。
我应该怎么做才能始终填充created_by
和updated_by
?
【讨论】:
我没有尝试过,但我认为您可能需要使用post
挂钩?也许在ProjectSchema.post('save', autoPopulate);
的链接中有些东西
为了节省时间,您可以使用这个插件:npmjs.com/package/mongoose-autopopulate,它会在您的查询结果中添加整个引用文档数组...以上是关于Mongoose.js:强制总是填充的主要内容,如果未能解决你的问题,请参考以下文章