对findByIdAndUpdate进行一致的预保存验证

时间:2016-02-19 01:39:29

标签: node.js mongoose

我正在尝试找到一种一致的方法来验证我保存到数组中的一些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中间件。这可能是最有希望的,因为在这两种情况下都会调用这个中间件。但是,尝试从update语句中提取otherIds是不一致的,因为每个更新语句都是非常不同的。这似乎很脆弱,因为任何时候有人添加一个新的更新语句,他们可能需要修改这个中间件以适应可能不同的更新语句。

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

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

1 个答案:

答案 0 :(得分:1)

另一个解决方案是首先致电 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); navigationView.setItemIconTintList(null); ,然后再findById(...)该文件。

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

findByIdAndUpdate(...)

但是,该解决方案的问题是schema.pre('update', function() { this.update({},{ $set: { updatedAt: new Date() } }); }); 是查询对象,而不是文档,它不是验证的理想选择。