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

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

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

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

?

【问题讨论】:

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

标签: javascript node.js mongodb mongoose


【解决方案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

    【讨论】:

    【解决方案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,它会在您的查询结果中添加整个引用文档数组...
    猜你喜欢
    • 2014-11-03
    • 2016-03-03
    • 2018-06-21
    • 2012-09-28
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多