Javascript异步数据库查询

时间:2017-07-12 23:42:10

标签: javascript node.js amazon-web-services express asynchronous

我对AWS数据库,Node.JS和Express完全不熟悉。我需要对AWS dynamodb数据库进行多次查询(汇总所有device_id计数并循环遍历所有bin)。我的代码如下。查询参数逻辑不完整,但我甚至无法确定从哪里开始编译异步逻辑并将查询返回到我的API中输出。

我尝试了嵌套循环,但很快意识到逻辑错误,因为所有数据库调用都是异步的。我尝试使用async.map()但无法弄清楚如何完成它。我应该重复我对deviceIds的async.map()所做的事情,但是将它嵌套在bin中?如何将内部async.map()值返回到外部呢?或者有一种更优雅的方式来做到这一点,我甚至没有想过?

如果有人有任何额外资源和/或基本框架的描述,我将非常感激。

谢谢!

var getCoffeeHistogram = function() {
  var counts = [];
  var bins = fillRange(16);
  var deviceIDs = fillRange(18);

  var i;
  for (i = 0; i < 16; i++) {
    async.map(
        deviceIDs,
        function(deviceID, callback) {
            var param = {
                TableName: "iot-coffeecounts",
                ExpressionAttributeValues: {
                    ':id': "" + deviceID,
                    ':time': "1"
                },
                ExpressionAttributeNames: {
                    "#ts": "timestamp"
                },
                KeyConditionExpression: "device_id = :id and #ts > :time"
            };

            docClient.query(param, function(err, data) {
                if (err) {
                    console.log("Unable to query. Error:", JSON.stringify(err, null, 2));
                } else {
                    console.log("Querying Succeeded for device");
                }
                callback(null, data.Count);
            });

        },
        function(err, coffeeCounts) {
            console.log(function(coffeeCounts) {
                var total = 0;
                for (count in coffeeCounts) {
                    total = total + count;
                }
                return total;
            });
        }
    );
  }
};

1 个答案:

答案 0 :(得分:0)

您可以在dynamodb中使用batchGet方法在单个查询中返回所有设备ID的结果,而不是通过设备ID循环并发出多个查询(效率非常低)。

您只需根据文档构建包含所有设备ID的查询对象并发出查询。

相关问题