使用异步 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/… 您实际输入了什么来查看值? nutrvalNutr_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 和猫鼬连接性能表的主要内容,如果未能解决你的问题,请参考以下文章

javascript 基本快递和猫鼬CRUD应用程序

javascript 基本快递和猫鼬CRUD应用程序

GraphQL 和猫鼬有啥区别?

我应该如何与摩卡和猫鼬一起使用?

在带有 loadClass 的打字稿中使用 es6 类和猫鼬

打字稿和猫鼬:“文档”类型上不存在属性“x”