0
var asynclib = require('async');

exports.apiFindNutrients = function(req, res) {
    var ndb = req.params.ndb;

    NutrDefModel.find().limit(30).exec(function(error, nutref) {

            asynclib.mapSeries(nutref, function(ref, callback) {

              NutrModel.find({ Nutr_No: ref.Nutr_No, Ndb_No: ndb }, function(error, nutrient) {

                  console.log(nutrient + 'nutrval: ' + nutrient.Nutr_Val);
                  var result = {
                      Ndb_No: nutrient.Ndb_No,
                      Nutr_No: ref.Nutr_No,
                      Units: ref.Units,
                      Tagname: ref.Tagname,
                      Nutr_Desc: ref.Nutr_Desc,
                      Nutr_Val: nutrient.Nutr_Val
                  };


                      callback(null, result);
                  }
              });

            }, function (err, result) {
                if (err)
                    console.log('async lib ' + err);
                res.send(result);
            });

        }
    });

};

私はマングースで2つのテーブルを結合したいのですが、上記の解決策を思いつきましたが、NutrDefModelの70項目で12秒かかり、limit(30)をすると1.5秒かかります。1秒以内に改善する必要があります。私は非同期javascriptとmongooseに本当に慣れていません。このソリューションで非同期ライブラリがどのように機能するか、javascriptとmongooseでどのような代替手段があるかをほとんど理解していません。

いくつかのインデックスを追加してパフォーマンスを向上させましたが、別の問題が発生しました。上記の console.log 行は出力を生成します:

{ Ndb_No: 3198,
  Nutr_No: 318,
  Nutr_Val: '144',
  _id: 5222665eab19d2db1800379d }nutrval: undefined

栄養オブジェクトに Nutr_Val が含まれていることがわかりますが、ニュートリエント.Nutr_Val は undefined を出力します。なんで?

4

1 に答える 1

2

MongoDB との結合を試みないことをお勧めします。代わりに、クエリの要件により適合するようにスキーマとコレクションを調整するためのオプションを調査します。

表示されている問題は、findメソッドが配列を返すことです (クエリのドキュメント)。単一/正確な結果しかないことがわかっている場合は、findOne代わりに使用することをお勧めします。

NutrModel.find({ Nutr_No: ref.Nutr_No, Ndb_No: ndb }, function(error, nutrient) {
     if (err) { console.log('error!'); return; }
     console.log("count: " + nutrient.length);
     for(var i=0, len=nutrient.length; i < length; i++) {
        var onenutrient = nutrient[i];
        // now, do something ...
     } 
     callback(null, result);
   }
);

あるいは単に

NutrModel.findOne({ Nutr_No: ref.Nutr_No, Ndb_No: ndb }, function(error, nutrient) {
    if (err) { console.log('error!'); return; }
    // do something with the nutrient
} 
于 2013-09-01T14:57:12.710 に答える