我的应用程序使用Mongoose并且具有使用timestamps option:
的架构var fooSchema = new Schema({
name: String,
}, {
timestamps: true,
});
mongoose.model('Foo', fooSchema);
因此,只要将更新写入集合,updatedAt
属性就会更改为当前日期。但是现在我想添加一些应该不更新updatedAt
属性的更改。
Stackoverflow(example)上的一些答案建议使用Foo.collection
,因为据称它访问本机MongoDB驱动程序。所以我尝试了这个:
Foo.collection.update({ _id: someFooId }, { $set: { name: 'New Name' } });
但是,这也改变了updatedAt
属性。
那么如何更新文档而不更改updatedAt
?
答案 0 :(得分:6)
我刚刚找到了一个解决方案,它对我来说很完美。
mongoose.connection.db.collection('player').update(
{_id: mongoose.Types.ObjectId('56cb91bdc5946f14678934ba')},
{$set: {name: 'Test'}}
});
此查询不会更新updatedAt
字段。希望你还需要这个!
答案 1 :(得分:1)
从猫鼬5开始,可以在Model.updateOne()和model.update()中传递时间戳选项,以跳过此更新的时间戳。
直接来自docs:
[options.timestamps = null]«Boolean»如果设置为false并且启用了模式级时间戳,请跳过此更新的时间戳。请注意,这使您可以覆盖时间戳。如果未设置架构级时间戳,则不执行任何操作。
例如问题中给出的,可以像这样跳过时间戳更新,
Foo.updateOne({ __id: someFooId },{ $set: { name: updatedName } }, { timestamps: false });
答案 2 :(得分:-1)
我能得到的是您自动更新updated_at
字段的日期时间。您必须在架构中传递updated_at
的默认值,只需删除该默认字段。
例如。
var fooSchema = new Schema({
name: String,
}, {
updated_at:{
type: Date,
default: Date.now
}
});
mongoose.model('Foo', fooSchema);
从default field
移除updated_at
,您的架构将如下所示。
var fooSchema = new Schema({
name: String,
}, {
updated_at: Date
});
mongoose.model('Foo', fooSchema);