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

Skip timestamps middleware for certain updates in Mongoose

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

的模式
var fooSchema = new Schema({
    name: String,
}, {
    timestamps: true,
});
mongoose.model('Foo', fooSchema);

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

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

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

那么如何更新文档,而不 更改 updatedAt

我能得到的是你正在自动更新 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);

我刚刚找到了一个解决方案,它非常适合我。

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

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

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

直接来自docs

[options.timestamps=null] «Boolean» If set to false and schema-level timestamps are enabled, skip timestamps for this update. Note that this allows you to overwrite timestamps. Does nothing if schema-level timestamps are not set.

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

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