跳过 Mongoose 中某些更新的时间戳中间件

Posted

技术标签:

【中文标题】跳过 Mongoose 中某些更新的时间戳中间件【英文标题】:Skip timestamps middleware for certain updates in Mongoose 【发布时间】:2016-12-01 23:38:57 【问题描述】:

我的应用程序使用 Mongoose,并且有一个使用 timestamps option 的架构:

var fooSchema = new Schema(
    name: String,
, 
    timestamps: true,
);
mongoose.model('Foo', fooSchema);

因此,每当将更新写入集合时,updatedAt 属性就会更改为当前日期。但现在我想添加一些不应该更新updatedAt 属性的更改。 *** (example) 上的一些答案建议使用Foo.collection,因为它据称会访问本机 MongoDB 驱动程序。所以我尝试了这个:

Foo.collection.update( _id: someFooId ,  $set:  name: 'New Name'  );

但是,这也改变了 updatedAt 属性。

那么如何在不更改updatedAt 的情况下更新文档

【问题讨论】:

我也有同样的问题。你有没有找到解决方案/解决方法? @danii 不,很遗憾没有。我删除了时间戳中间件并在必要时手动更新时间戳。 【参考方案1】:

从 mongoose 5 开始,可以在 Model.updateOne() 和 model.update() 中传递时间戳选项,以跳过此更新的时间戳。

直接来自docs:

[options.timestamps=null] «Boolean» 如果设置为 false 并且启用了架构级时间戳,则跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置架构级时间戳,则不执行任何操作。

例如问题中给出的,时间戳更新可以这样跳过,

Foo.updateOne( __id: someFooId , $set:  name: updatedName  ,  timestamps: false );

【讨论】:

【参考方案2】:

我刚刚找到了一个解决方案,它对我来说非常有效。

mongoose.connection.db.collection('player').updateOne(
    _id: mongoose.Types.ObjectId('56cb91sf34746f14678934ba'),
    $set: name: 'Test'
);

此查询不会更新updatedAt 字段。希望你仍然需要这个!

【讨论】:

两年后,面对同样的问题,谷歌寻找答案,找到带有我的 cmets 的旧线程(我当然完全忘记了),得到完全有效的答案。一定要喜欢 *** :) 编辑:这个答案应该被接受,它非常适合这个用例。不,永远不会太晚,谢谢!!【参考方案3】:

我能得到的是您正在自动更新updated_at 字段的日期时间。您必须在架构中传递 updated_at 的默认值,只需删除该默认字段即可。

例如。

var fooSchema = new Schema(
    name: String,
, 
    updated_at:
         type: Date,
         default: Date.now
    
);
mongoose.model('Foo', fooSchema);

updated_at 中删除default field,您的架构将如下所示。

var fooSchema = new Schema(
    name: String,
, 
    updated_at: Date
);
mongoose.model('Foo', fooSchema);

【讨论】:

"您必须在您的架构中传递 updated_at 的默认值" 不,发布的架构是完整的。而Schema的第二个参数是用于选项的,但是没有updated_at选项。 那么如果没有这样的密钥,您的updatedAt 字段将如何更新?附言。我将updated_at 仅用于参考您的updatedAt 见问题中提到的timestamp options。 好的,您应该将updatedAt 键直接传递到您的架构中,而不是使用它,因为使用timestamps 将在您每次更新文档时自动更新。你可以参考我提到的架构。 投反对票,因为这个答案错过了timestamp: true 功能,因此没有帮助。

以上是关于跳过 Mongoose 中某些更新的时间戳中间件的主要内容,如果未能解决你的问题,请参考以下文章

mongoose schema 设置更新时间戳为unix时间

mongoose schema 设置更新时间戳为unix时间

mongoose schema 设置更新时间戳为unix时间

mongoose 使用 $in 并且只用最近的时间戳更新一个

使用scrapy爬行时如何跳过某些文件类型?

MongoDB / Mongoose 时间戳未更新