当我“更新”时,Mongoose 操作字段是“查找”,为啥?

Posted

技术标签:

【中文标题】当我“更新”时,Mongoose 操作字段是“查找”,为啥?【英文标题】:Mongoose operation field is 'find' when I do 'update', why?当我“更新”时,Mongoose 操作字段是“查找”,为什么? 【发布时间】:2016-07-03 18:33:21 【问题描述】:

不知道是不是和Mongoose本身或者MongoDB驱动有关。

这是交易。我想将创建/更新的字段添加到我的架构中。我知道 Mongoose 可以开箱即用,但我需要使用 Unix Timestamp 而不是 date 对象。为此,我添加了在 Github (link to plugin) 上找到的插件,并将字段类型更改为 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' 字段不会被更改。

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

【问题讨论】:

Update 会定期调用 mongo 驱动程序。 Schema.update 设计绕过中间件。因此.pre 不适用于update。您可以获取更多详情:github.com/Automattic/mongoose/issues/2672 【参考方案1】:

您可以放弃插件并使用建议的 code here 和 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();
);

【讨论】:

以上是关于当我“更新”时,Mongoose 操作字段是“查找”,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

更新架构声明后,Mongoose 不会更新新字段

Mongoose 在读取/查找时删除不在架构上的字段

Mongoose 更新内部字段

使用 javascript 数组方法更新 mongoose 中的嵌套数组

Mongoose 聚合内部查找按字段分组

使用 Mongoose 查找子文档字段部分匹配给定条件的文档