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

时间:2016-07-27 19:39:32

标签: node.js mongodb mongoose mongoose-schema

我的应用程序使用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

3 个答案:

答案 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);