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

str*_*str 10 mongoose mongodb node.js mongoose-schema

我的应用程序使用Mongoose并具有使用timestamps选项的模式:

var fooSchema = new Schema({
    name: String,
}, {
    timestamps: true,
});
mongoose.model('Foo', fooSchema);
Run Code Online (Sandbox Code Playgroud)

因此,只要将更新写入集合,该updatedAt属性就会更改为当前日期.但是现在我想添加一些应该更新updatedAt属性的更改.Stackoverflow(示例)上的一些答案建议使用Foo.collection,因为据称访问本机MongoDB驱动程序.所以我尝试了这个:

Foo.collection.update({ _id: someFooId }, { $set: { name: 'New Name' } });
Run Code Online (Sandbox Code Playgroud)

然而,这也改变了updatedAt财产.

那么如何在更改的情况下更新文档updatedAt

jok*_*007 12

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

\n

直接来自文档

\n
\n

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

\n
\n

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

\n
Foo.updateOne({ __id: someFooId },{ $set: { name: updatedName } }, { timestamps: false });\n
Run Code Online (Sandbox Code Playgroud)\n


Tru*_*hat 8

我刚刚找到了解决方案,它对我来说非常合适.

mongoose.connection.db.collection('player').update(
    {_id: mongoose.Types.ObjectId('56cb91bdc5946f14678934ba')},
    {$set: {name: 'Test'}}
});
Run Code Online (Sandbox Code Playgroud)

此查询不会更新该updatedAt字段.希望你还需要这个!

  • 两年后,面对同样的问题,谷歌寻找答案,找到我对它的评论的旧线程(我当然完全忘记了),得到完全有效的答案。必须喜欢 Stackoverflow :) 编辑:应该接受这个答案,它非常适合这个用例。不,永远不会太晚,谢谢!! (3认同)