使用异步javascript和mongoose连接性能表
我想用mongoose连接两个表,我提出了上面的解决方案,但是NurtDefModel中70个项目需要12秒,当我限制(30)时需要1.5秒。我需要提高到1秒以下。 我对异步javascript和mongoose非常陌生,我几乎不了解异步库在这个解决方案中是如何工作的,我对javascript和mongoose有什么不同之处 我添加了一些索引以提高性能,但现在我遇到了另一个问题。上面的console.log行生成输出:使用异步javascript和mongoose连接性能表,javascript,sql,node.js,mongodb,asynchronous,Javascript,Sql,Node.js,Mongodb,Asynchronous,我想用mongoose连接两个表,我提出了上面的解决方案,但是NurtDefModel中70个项目需要12秒,当我限制(30)时需要1.5秒。我需要提高到1秒以下。 我对异步javascript和mongoose非常陌生,我几乎不了解异步库在这个解决方案中是如何工作的,我对javascript和mongoose有什么不同之处 我添加了一些索引以提高性能,但现在我遇到了另一个问题。上面的console.log行生成输出: var asynclib = require('async'); expo
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);
});
}
});
};
您可以看到nutrition对象包含Nutr_Val,但nutrient.Nutr_Val打印未定义。为什么?我建议不要尝试加入MongoDB,而是研究调整模式和集合以更好地满足查询要求的选项 您看到的问题是
find
方法返回一个数组()。如果您知道只有一个/精确的结果,我建议您使用findOne
{ Ndb_No: 3198,
Nutr_No: 318,
Nutr_Val: '144',
_id: 5222665eab19d2db1800379d }nutrval: undefined
如果您需要使用Mongodb连接表,那么您的模式设计得很糟糕,因为它不能有效地支持它们。您需要重新考虑您的设计。我添加了一些索引,它运行得更快,但现在我有另一个问题,请参见上面的编辑。您的字段名拼写不同。一定要准确。案例很重要。拼写正确,我检查了很多次。我在这里发现了一个类似的问题,但在我的例子console.log(typeof nutrient)中产生了一个我不知道如何修复的对象:(您实际键入什么来查看值?
nutrval
与Nutr\Val
不同。
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
}