gpt4 book ai didi

node.js - findByIdAndUpdate 的一致预保存验证

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:08 25 4
gpt4 key购买 nike

我正在尝试找到一种一致的方法来验证我保存到数组中的一些 id。

架构:

var MySchema = new Schema({
name: { type: String },
otherIds: [{type: Schema.Types.ObjectId, ref: 'Other'}]
});

一些更新声明:

根据 ID 更新整个文档

var update = {
otherIds: someIds
};
MyModel.findByIdAndUpdate(id, event, ...);

让我们添加到 otherIds 集中:

var update = {
$addToSet: {
otherIds: someId
}
};
MyModel.findByIdAndUpdate(id, update, ...);

据我所知,有几种方法可以验证这些 id,但我在使用所有这些方法时都遇到了问题。

  1. 使用保存中间件。这不起作用,因为使用 findAndUpdate 命令时不会调用保存中间件。

  2. 使用 findOneAndUpdate 中间件。这可能是最有希望的,因为在这两种情况下都会调用该中间件。然而,尝试从更新语句中提取 otherId 是不一致的,因为每个更新语句都非常不同。这似乎很脆弱,因为每当有人添加新的更新语句时,他们可能必须修改此中间件以适应可能不同的更新语句。

  3. 使用验证器。我尝试过使用验证器,它对于第一次更新效果很好,但对于第二次更新则不运行。根据文档,验证器仅针对 $set 和 $unset 命令运行,而 $addToSet 不属于该类别。

还有其他选择或我可能错过的任何内容吗?

最佳答案

另一种解决方案是首先调用 findById(...),然后调用 .save() 该文档。

如果您需要坚持使用findByIdAndUpdate(...),您还可以使用 query middleware (需要 Mongoose >= 4)

schema.pre('update', function() {
this.update({},{ $set: { updatedAt: new Date() } });
});

但是,该解决方案的问题是 this 是查询对象,而不是文档,这对于验证来说并不理想。

关于node.js - findByIdAndUpdate 的一致预保存验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com