使用异步 javascript 和猫鼬连接性能表
Posted
技术标签:
【中文标题】使用异步 javascript 和猫鼬连接性能表【英文标题】:performance table join with async javascript and mongoose 【发布时间】:2013-09-01 07:53:09 【问题描述】: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 中的 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 打印未定义。为什么?
【问题讨论】:
如果您需要将表与 Mongodb 连接起来,您的架构设计得很糟糕,因为它不能有效地支持它们。你需要重新考虑你的设计。 我添加了一些索引,它的工作速度更快,但现在我遇到了另一个问题,请参阅上面的编辑。 您的字段名称拼写不同。必须准确。案件很重要。 拼写正确,我检查了很多次。我在这里发现了一个类似的问题,但在我的情况下,console.log(typeof nutrition) 产生的对象我不知道如何解决它:(***.com/questions/7922226/… 您实际输入了什么来查看值?nutrval
与 Nutr_Val
不同。
【参考方案1】:
我建议不要尝试与 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
【讨论】:
以上是关于使用异步 javascript 和猫鼬连接性能表的主要内容,如果未能解决你的问题,请参考以下文章