2

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

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

每当发生更改时,如何num_pieces自动填充数组的长度?pieces

我愿意使用 SimpleSchemaautoValuematb33:collection-hooks. pieces可能会通过很多运算符进行更改,例如$push, $pull, $set, 可能还有 Mongo 必须提供的更多运算符,我不知道如何应对这些可能性。理想情况下,只需查看pieces更新后的值,但您如何做到这一点并进行更改,而不会在 collection-hook 上陷入一点无限循环?

4

2 回答 2

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是当前文档。这应该足以让您完成其余的案例。

于 2016-03-08T01:51:58.017 回答
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();
      }
    }    
  },
});
于 2016-03-08T13:13:46.730 回答