Meteor:如何自动填充存储在集合中其他字段中的数组长度的字段?

时间:2016-03-07 22:45:54

标签: meteor simple-schema meteor-collection-hooks

我有一个使用SimpleSchema / Collection2定义的集合,如下所示:

Schema.Stuff = new SimpleSchema({
    pieces: {
        type: [Boolean],
    },
    num_pieces: {
        type: Number,
    },

如果有任何更改,我如何让num_pieces自动填充pieces数组的长度?

我愿意使用SimpleSchema的autoValuematb33:collection-hookspieces可能会被很多运算符更改,例如$push$pull$set,以及Mongo必须提供的更多,我不知道如何应对这些可能性。理想情况下,只需要在更新后查看pieces的值,但是如何在不进入集合挂钩的无限循环的情况下进行更改并进行更改?

2 个答案:

答案 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();
      }
    }    
  },
});