2

次のように SimpleSchema/Collection2 で定義されたコレクションがあります。

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

変更があるたびに、配列num_piecesの長さが自動的に入力されるようにするにはどうすればよいですか?pieces

私は SimpleSchema のautoValueorを使用することにオープンですmatb33:collection-hooks。 、、、およびおそらく Mongo が提供するより多くpiecesの演算子で変更される可能性があり、これらの可能性に対処する方法がわかりませんでした。理想的には、更新後に の値を確認するだけですが、コレクション フックで無限ループに入ることなく、どうすればそれを実行して変更を加えることができるでしょうか?$push$pull$setpieces

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 に答える