跳过 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时间