0

私はCategoryそれが唯一の財産であるモデルを持っていますname

モデルの名前を含む文字列フィールドとを含むSubCategoryモデルもあります。namecategoryCategory

Categoryモデルがname変更されると、そのカテゴリを指すそれぞれがSubCategorycategory新しい名前に一致するようにそのフィールドを更新する必要があります。

私は現在SubCategories、特定のカテゴリを指すすべてのポイントを取得し、それらを反復処理してそのカテゴリフィールドを更新することにより、ルートハンドラに直接これを実装しています。

このロジックを、それが属するべきモデルに実装したいと思います。

Categoryモデルにプリミドルウェアを作成しました。

CategorySchema.pre('save', function(next) {
  console.log('Saving ' + this.name);
  next();
});

リクエストを担当するルートハンドラーは、PUT次のように更新された名前でモデルを保存します。

...
parentCategory.name = requestedName;
parentCategory.validate(function(validationError) {          
  if (validationError) {
    return res.send(response.BAD_REQUEST); 
  }     
  parentCategory.save(function(saveError) {       
    if(saveError) {
      return res.send(response.SERVER_ERROR);        
    }
  });
});
...

ただし、新しい名前が印刷されるので、新しい名前にしかアクセスできないため、サブカテゴリを繰り返すことはできません。

古い名前と新しい名前の両方をミドルウェアに渡して、そこで作業を行う方法がわかりません。

4

2 に答える 2

2

次のようにCategoryモデルを検索することで、古い値にアクセスできました。

CategorySchema.pre('save', function(next) {
    var that = this;
    var updateEachSubCategory = function(subcategory) {
    subcategory.category = that.name;
    subcategory.save(function(saveError) {
      if(saveError) {
        console.log(saveError);
        return 1;                    
      }
    });
  };
    var updateChildrenCategoryField = function(err, subCategoriesArray) {
        solange.asyncFor(subCategoriesArray, updateEachSubCategory);   
    };
    var findChildren = function(categorySearchError, categoryFound) {
        if(!categorySearchError) {
            mongoose.models["SubCategory"].find({ category: categoryFound.name }, updateChildrenCategoryField);
        }
    };
    mongoose.models["Category"].findOne({ _id: this._id }, findChildren);
    next();
});

これは保存のミドルウェアであるため、新しい名前はまだ保存されていないため、モデルをクエリすることでアクセスできます。

于 2013-02-04T22:36:05.650 に答える
0

私の解決策は、初期化後のミドルウェアで属性値をバックアップすることです

schema.post('init', function(model) {
  model.oldValues = JSON.parse(JSON.stringify(model));
}

他のミドルウェアでこれらの属性にアクセスできるよりも、たとえばthis.someAttr === this.oldValues.someAttr属性を変更する前などです。

確認する要点を書きました。

これからの出力は次のとおりです。

    ------------------
    事前初期化属性
    ドキュメントは新しく、アプリをもう一度実行します
    ------------------
    ------------------
    初期化属性を投稿する
    {_id:55a37cc88ff0f55e6ee9be2d、
      名前:'テスト1-12:07:88'、
      __v:0、
      準備完了:true}
    this.oldValuesの設定
    ------------------
    ------------------
    事前保存属性
    {_id:55a37cc88ff0f55e6ee9be2d、
      名前:'テスト1-12:07:16'、
      __v:0、
      準備完了:false}
    ------------------
    ------------------
    保存属性の投稿
    {_id:55a37cc88ff0f55e6ee9be2d、
      名前:'テスト1-12:07:16'、
      __v:0、
      準備完了:false}
    古い属性(model.oldValues)
    {_id: '55a37cc88ff0f55e6ee9be2d'、
      名前:'テスト1-12:07:88'、
      __v:0、
      準備完了:true}
    ------------------
于 2015-07-13T09:47:47.720 に答える