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);
});
}
});
};
我想用mongoose加入两个表,我想出了上面的解决方案,但在NutrDefModel中需要12秒才能获得70个项目,当我限制(30)需要1.5秒时。我需要提高到不到1秒。 我对async javascript和mongoose真的很陌生,我几乎不了解异步库在这个解决方案中是如何工作的,我用javascript和mongoose做了哪些改进。
我添加了一些改进了性能的索引,但现在又出现了另一个问题。在console.log行上方生成输出:
{ Ndb_No: 3198,
Nutr_No: 318,
Nutr_Val: '144',
_id: 5222665eab19d2db1800379d }nutrval: undefined
你可以看到营养对象包含Nutr_Val但营养素.Nutr_Val打印未定义。为什么呢?
答案 0 :(得分:2)
我建议不要尝试与MongoDB进行联接,而是调查用于调整架构和集合的选项,以更好地满足您的查询要求。
您看到的问题是find
方法返回一个数组(docs for query)。如果您知道只有一个/完全结果,我建议您改为使用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
}