2013-09-01 1 views
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); 
      }); 

     } 
    }); 

}; 

몽구스 자바 스크립트와 비동기로 참여, 나는 위의 솔루션을 함께했다하지만 내가 제한을 수행 할 때 (30)이 소요 NutrDefModel 70 개 항목 12 초 정도 걸립니다 1.5 초. 1 초 미만으로 개선해야합니다. 저는 비동기 자바 스크립트와 몽구스를 처음 접했을뿐입니다.이 솔루션에서 비동기 라이브러리가 어떻게 작동하는지 간략하게 이해할 수 있습니다. 자바 스크립트와 몽구스로 교훈을 얻으려면 어떻게해야할까요?성능 표가 나는 몽구스 두 개의 테이블을 조인 할

몇 가지 색인을 추가하여 성능을 향상 시켰지만 이제는 또 다른 문제가 있습니다. CONSOLE.LOG 라인이 출력을 생성 위 :

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

당신이 영양 개체를 볼 수는 Nutr_Val하지만 nutrient.Nutr_Val 인쇄 정의가 포함되어 있습니다. 왜?

+0

이 효율적으로 지원하지 않기 때문에 당신이 MongoDB를 함께 테이블에 참여해야하는 경우가 가난하여 스키마를 설계 한

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); } ); 

또는. 디자인을 재고해야합니다. – WiredPrairie

+0

일부 인덱스를 추가했는데 더 빨리 작동하지만 다른 문제가 있습니다. 위의 편집을 참조하십시오. –

+0

필드 이름의 철자가 다릅니다. 정확해야합니다. 케이스 문제. – WiredPrairie

답변

2

MongoDB와의 조인을 시도하지 말고 대신 쿼리 요구 사항에 맞게 스키마 및 컬렉션 조정 옵션을 조사합니다.

표시되는 문제는 find 메서드가 배열 (docs for query)을 반환한다는 것입니다. 단 하나의 정확한 결과 만 있다는 것을 알고 있다면 대신 findOne을 사용하는 것이 좋습니다. 단지

NutrModel.findOne({ Nutr_No: ref.Nutr_No, Ndb_No: ndb }, function(error, nutrient) { 
    if (err) { console.log('error!'); return; } 
    // do something with the nutrient 
} 
관련 문제