我有一个使用SimpleSchema / Collection2定义的集合,如下所示:
Schema.Stuff = new SimpleSchema({
pieces: {
type: [Boolean],
},
num_pieces: {
type: Number,
},
如果有任何更改,我如何让num_pieces
自动填充pieces
数组的长度?
我愿意使用SimpleSchema的autoValue
或matb33:collection-hooks
。 pieces
可能会被很多运算符更改,例如$push
,$pull
,$set
,以及Mongo必须提供的更多,我不知道如何应对这些可能性。理想情况下,只需要在更新后查看pieces
的值,但是如何在不进入集合挂钩的无限循环的情况下进行更改并进行更改?
答案 0 :(得分:1)
以下是一个示例,说明如何在更新后执行集合挂钩,以防止无限循环:
Stuff.after.update(function (userId, doc, fieldNames, modifier, options) {
if( (!this.previous.pieces && doc.pieces) || (this.previous.pieces.length !== doc.pieces.length ) {
// Two cases to be in here:
// 1. We didn't have pieces before, but we do now.
// 2. We had pieces previous and now, but the values are different.
Stuff.update({ _id: doc._id }, { $set: { num_pieces: doc.pieces.length } });
}
});
请注意,this.previous
可让您访问上一个文档,doc
是当前文档。这应该足以让你完成其余的案件。
答案 1 :(得分:0)
您也可以在架构中正确执行
Schema.Stuff = new SimpleSchema({
pieces: {
type: [Boolean],
},
num_pieces: {
type: Number,
autoValue() {
const pieces = this.field('pieces');
if (pieces.isSet) {
return pieces.value.length
} else {
this.unset();
}
}
},
});