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

Node.js 跳过Mongoose中某些更新的时间戳中间件,node.js,mongodb,mongoose,mongoose-schema,Node.js,Mongodb,Mongoose,Mongoose Schema,我的应用程序使用Mongoose,其架构使用: 因此,每当向集合写入更新时,updatedAt属性都会更改为当前日期。但是现在我想添加一些不应该更新updatedAt属性的更改。 关于Stackoverflow()的一些回答建议使用Foo.collection,因为它据称访问本机MongoDB驱动程序。所以我试了一下: Foo.collection.update({ _id: someFooId }, { $set: { name: 'New Name' } }); 但是,这也改变了updat

我的应用程序使用Mongoose,其架构使用:

因此,每当向集合写入更新时,
updatedAt
属性都会更改为当前日期。但是现在我想添加一些不应该更新
updatedAt
属性的更改。 关于Stackoverflow()的一些回答建议使用
Foo.collection
,因为它据称访问本机MongoDB驱动程序。所以我试了一下:

Foo.collection.update({ _id: someFooId }, { $set: { name: 'New Name' } });
但是,这也改变了
updatedAt
属性


因此,我如何更新文档而不更改
updatedAt

我可以得到的是,您正在自动更新
updated\u的日期时间(位于
字段)。您必须在模式中为位于的
updated_传递默认值,只需删除该默认字段即可

比如说

var fooSchema = new Schema({
    name: String,
}, {
    updated_at:{
         type: Date,
         default: Date.now
    }
});
mongoose.model('Foo', fooSchema);
从位于
updated_中删除
默认字段
,您的模式将如下所示

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()中传递时间戳选项,以跳过此更新的时间戳

直接来自:

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

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

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

“您必须在您的架构中传递更新的位置的默认值”否,发布的架构是完整的。
Schema
的第二个参数是用于选项,但在
选项中没有
updated\u。那么,如果没有这样的键,您的
updatedAt
字段是如何更新的?注:我将
updated_放在
中,仅参考您的
updatedAt
。请参见问题中提到的内容。好的,您应该将
updatedAt
键直接传递到模式中,因为每次更新文档时,使用
时间戳将自动更新。你可以参考我提到的模式。由于这个答案忽略了
timestamp:true
功能,因此没有帮助。我也有同样的问题。你有没有找到解决方案/解决方法?@danii没有,很遗憾没有。我删除了时间戳中间件,并在必要时手动更新时间戳。两年后,面对同样的问题,谷歌搜索答案,找到旧线程w/我对它的评论(我当然完全忘记了),得到完全有效的答案。必须爱Stackoverflow:)编辑:这个答案应该被接受,它非常适合这个用例。不,永远不会太晚,谢谢!!
Foo.updateOne({ __id: someFooId },{ $set: { name: updatedName } }, { timestamps: false });