跳过 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 });
我的应用程序使用 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 });