我正在尝试找到一种一致的方法来验证我保存到数组中的一些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,但我遇到了所有这些问题。
使用保存中间件。这不起作用,因为在使用findAndUpdate命令时不会调用保存中间件。
使用findOneAndUpdate中间件。这可能是最有希望的,因为在这两种情况下都会调用这个中间件。但是,尝试从update语句中提取otherIds是不一致的,因为每个更新语句都是非常不同的。这似乎很脆弱,因为任何时候有人添加一个新的更新语句,他们可能需要修改这个中间件以适应可能不同的更新语句。
使用验证器。我尝试使用验证器,它适用于第一次更新,但不会运行第二次更新。根据文档,验证器仅针对$ set和$ unset命令运行,$ addToSet不属于该类别。
还有其他选择或我可能错过的任何内容吗?
答案 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() } });
});
是查询对象,而不是文档,它不是验证的理想选择。