猫鼬JS预保存钩子与引用值

MongooseJS Pre Save Hook with Ref Value

本文关键字:引用 JS 保存 猫鼬      更新时间:2023-09-26

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

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

图式:

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。

如何完全填充此字段,以便我可以在预保存钩子中使用它?

谢谢

您需要执行另一个查询,但这并不难。人口只适用于查询,我不相信这种情况有方便的钩子。

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