具有参考值的 MongooseJS 预保存挂钩

MongooseJS Pre Save Hook with Ref Value

我想知道是否可以在 MongooseJS 的预保存挂钩中获取架构字段的填充引用值?

我正在尝试从 ref 字段中获取一个值,我需要 ref 字段(下面,即 User 字段),以便我可以从中获取时区。

架构:

var TopicSchema = new Schema({
    name: {
        type: String,
        default: '',
        required: 'Please fill Topic name',
        trim: true
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    nextNotificationDate: {
        type: Date
    },
    timeOfDay: {                                    // Time of day in seconds starting from 12:00:00 in UTC. 8pm UTC would be 72,000
        type: Number,
        default: 72000,                             // 8pm
        required: 'Please fill in the reminder time'
    }
});

预保存挂钩:

/**
 * Hook a pre save method to set the notifications
 */
TopicSchema.pre('save', function(next) {

    var usersTime = moment().tz(this.user.timezone).hours(0).minutes(0).seconds(0).milliseconds(0);  // Reset the time to midnight
    var nextNotifyDate = usersTime.add(1, 'days').seconds(this.timeOfDay);                       // Add a day and set the reminder
    this.nextNotificationDate = nextNotifyDate.utc();

    next();
});

在上面的保存挂钩中,我试图访问 this.user.timezone 但该字段未定义,因为 this.user 仅包含一个 ObjectID。

如何让这个字段完全填充以便我可以在预保存挂钩中使用它?

谢谢

您需要再做一次查询,但这并不难。 Population 仅适用于查询,我不相信这种情况下有方便的钩子。

var User = mongoose.model('User');

TopicSchema.pre('save', function(next) {
  var self = this;
  User.findById( self.user, function (err, user) {
    if (err) // Do something
    var usersTime = moment().tz(user.timezone).hours(0).minutes(0).seconds(0).milliseconds(0);  // Reset the time to midnight
    var nextNotifyDate = usersTime.add(1, 'days').seconds(self.timeOfDay);                       // Add a day and set the reminder
    self.nextNotificationDate = nextNotifyDate.utc();

    next();
  });
});