1

解決できない奇妙な問題があります。私はマングーススキーマを持っています:

Product = new Schema({
  title: {
     type: String
  },
  prices: {
     type: Array
  },
  sync: {
     type: Boolean
  }
  ...

同期フラグがtrueの場合、ポストセーブミドルウェアを使用してサードパーティのサイトを更新します。その操作が戻ったら、prices配列を更新し、syncをfalseに設定して、無限ループが発生しないようにします。

Product.post('save', function () { 
    if(this.sync) {
        this.title = "HELLO";
        this.prices[0].retail = '24';
        this.sync = false;
        this.save();
    }
});

上記を実行すると、タイトルと同期フィールドは変更されますが、価格配列は変更されません。実際、スキーマ内の配列を更新できません。上記の例では、prices配列には約10個のエントリが含まれています。各エントリには、小売フィールドを含む多くのフィールドが含まれています。また、その配列に追加してみました。

this.prices.push({ retail: "10 });

アレイを再初期化するだけでなく、次のようにします。

this.prices = [];

私が何をしても効果はありません。ただし、配列以外のフィールドは更新できます。

何が起こっているのかアイデアはありますか?

4

1 に答える 1

2

配列フィールド内のスキーマを指定しない場合(のようにprices)、Mongooseはそれをフィールドとして扱い、MongooseがスキーマMixedを保存できるように、変更をMongooseに通知する必要があります。ここにドキュメントがあります。

したがって、コードは次のように変更する必要があります。

Product.post('save', function () { 
    if(this.sync) {
        this.title = "HELLO";
        this.prices[0].retail = '24';
        this.markModified('prices');
        this.sync = false;
        this.save();
    }
});
于 2012-11-07T13:19:28.733 に答える