0

我不知道这是否与 Mongoose 本身或 MongoDB 驱动程序有关。

这是交易。我想将创建/更新的字段添加到我的模式中。我知道 Mongoose 可以开箱即用,但我需要使用 Unix Timestamp 而不是 date 对象。为了实现这一点,我添加了我在 Github 上找到的插件(链接到插件),并将字段类型更改为 Number 以存储时间戳。

我在插件源代码中找到了这些行:

schema.pre('update', function(next) {
    if (this.op === 'update') {
        this._update = this._update || {};
        this._update[updatedAt] = new Date().getTime;
        this._update['$setOnInsert'] = this._update['$setOnInsert'] || {};
        this._update['$setOnInsert'][createdAt] = new Date().getTime;
    }
    next();
    });

如果我做

MyAwesomeModel.update(...., function (e, d) {...});

this.op将等于'find',而不是'update',因此'updated' 字段不会被更改。

我不明白为什么会这样,为什么操作是“查找”而不是“更新”。我试图通过猫鼬源代码搜索,但到目前为止我还没有找到答案。

4

1 回答 1

0

您可以放弃插件并在此处使用建议的代码Date.now()(now() 返回 Unix 时间戳):

var ItemSchema = new Schema({
    name        : { type: String, required: true, trim: true },
    created_at  : { type: Number },
    updated_at  : { type: Number }
});

ItemSchema.pre('save', function(next){
  now = Date.now();
  this.updated_at = now;
  if ( !this.created_at ) {
    this.created_at = now;
  }
  next();
});
于 2016-03-17T13:53:14.393 回答