gpt4 book ai didi

javascript - 使用异步 javascript 和 mongoose 进行性能表连接

转载 作者:行者123 更新时间:2023-12-02 18:24:03 25 4
gpt4 key购买 nike

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.Nutr_Val 打印未定义。为什么?

最佳答案

我建议不要尝试与 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 - 使用异步 javascript 和 mongoose 进行性能表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com