【问题标题】:Skip timestamps middleware for certain updates in Mongoose跳过 Mongoose 中某些更新的时间戳中间件
【发布时间】:2016-12-01 23:38:57
【问题描述】:

我的应用程序使用 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 的情况下更新文档

【问题讨论】:

  • 我也有同样的问题。你有没有找到解决方案/解决方法?
  • @danii 不,很遗憾没有。我删除了时间戳中间件并在必要时手动更新时间戳。

标签: node.js mongodb mongoose mongoose-schema


【解决方案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 的旧线程(我当然完全忘记了),得到完全有效的答案。一定要喜欢 Stackoverflow :) 编辑:这个答案应该被接受,它非常适合这个用例。不,永远不会太晚,谢谢!!
    【解决方案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 功能,因此没有帮助。
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多