Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript DynamoDB扫描返回多个扫描结果_Javascript_Node.js_Amazon Web Services_Asynchronous_Aws Lambda - Fatal编程技术网

Javascript DynamoDB扫描返回多个扫描结果

Javascript DynamoDB扫描返回多个扫描结果,javascript,node.js,amazon-web-services,asynchronous,aws-lambda,Javascript,Node.js,Amazon Web Services,Asynchronous,Aws Lambda,所以我写了下面的函数。这个版本有点简略,我已经匿名化了数据,但关键的组件在那里 该函数基本上从API网关调用中获取参数列表,查询数据库中的每个参数,然后返回结果 我发现扫描只使用一个参数就可以完美运行,但调用多个参数时会返回重复数据。从日志中我可以看到,当传递多个参数时,扫描正在运行多次 例如,对于一个参数,函数记录返回值 2020-03-19 20:27:42.974 Starting the 0 scan with 3 as the id 2020-03-19 20:27:43.047 T

所以我写了下面的函数。这个版本有点简略,我已经匿名化了数据,但关键的组件在那里

该函数基本上从API网关调用中获取参数列表,查询数据库中的每个参数,然后返回结果

我发现扫描只使用一个参数就可以完美运行,但调用多个参数时会返回重复数据。从日志中我可以看到,当传递多个参数时,扫描正在运行多次

例如,对于一个参数,函数记录返回值

2020-03-19 20:27:42.974 Starting the 0 scan with 3 as the id 
2020-03-19 20:27:43.047 The 0 scan has completed successfully
使用两个参数,日志是

2020-03-19 20:28:42.189 Starting the 0 scan with 2 as the id
2020-03-19 20:28:42.261 The 0 scan has completed successfully
2020-03-19 20:28:42.262 Starting the 1 scan with 3 as the id
2020-03-19 20:28:42.267 The 0 scan has completed successfully
2020-03-19 20:28:42.293 The 1 scan has completed successfully
2020-03-19 20:29:49.209 Starting the 0 scan with 1 as the id
2020-03-19 20:29:49.323 The 0 scan has completed successfully
2020-03-19 20:29:49.325 Starting the 1 scan with 2 as the id
2020-03-19 20:29:49.329 The 0 scan has completed successfully
2020-03-19 20:29:49.380 The 1 scan has completed successfully
2020-03-19 20:29:49.381 Starting the 2 scan with 3 as the id
2020-03-19 20:29:49.385 The 1 scan has completed successfully
2020-03-19 20:29:49.437 The 2 scan has completed successfully
使用3个参数时,日志为

2020-03-19 20:28:42.189 Starting the 0 scan with 2 as the id
2020-03-19 20:28:42.261 The 0 scan has completed successfully
2020-03-19 20:28:42.262 Starting the 1 scan with 3 as the id
2020-03-19 20:28:42.267 The 0 scan has completed successfully
2020-03-19 20:28:42.293 The 1 scan has completed successfully
2020-03-19 20:29:49.209 Starting the 0 scan with 1 as the id
2020-03-19 20:29:49.323 The 0 scan has completed successfully
2020-03-19 20:29:49.325 Starting the 1 scan with 2 as the id
2020-03-19 20:29:49.329 The 0 scan has completed successfully
2020-03-19 20:29:49.380 The 1 scan has completed successfully
2020-03-19 20:29:49.381 Starting the 2 scan with 3 as the id
2020-03-19 20:29:49.385 The 1 scan has completed successfully
2020-03-19 20:29:49.437 The 2 scan has completed successfully
下面是运行for循环和扫描的代码。我已经硬编码了参数,排除了一些不相关的东西

     const params = ['1','2','3'];
     for (let i = 0; i < params.length; i++) {
      console.log("Starting the " + i + " scan with " + params[i] + " as the scan parameter")
      const scanParams = {
      TableName: "Dynamo_Table",
      FilterExpression: "Org = :Org",
      ExpressionAttributeValues: { ":Org": params[i] },
      ProjectionExpression: "User_ID, Org, first_name, last_name"
     };
     await dynamoClient.scan(scanParams, function(err, data) {
      if (err) {
        console.log("data retrival failed, error logged is :" + err);
        return err;
      }
      else {
        console.log("The " + i +" scan has completed successfully")
        //console.log("data retrival successful: " + JSON.stringify(data));
        userData = userData.concat(data.Items)
        //console.log("partial data structure is " + data)
      }
    }).promise();
  }
      responseData = JSON.stringify(userData)
      console.log("Complete response is " + responseData)
      console.log("data after execution scan is " + data)
const参数=['1','2','3'];
for(设i=0;i

我试图通过定义wait并使用AWS的.promise()函数来强制程序等待扫描的竞争。然而,这些似乎并没有阻止线程的执行。但我不确定它为什么要进行多次扫描。for循环的运行次数没有超过它应该运行的次数,那么为什么要调用搜索函数呢?

每当您想在DynamoDB数据库中搜索某个内容时,建议您使用查询选项,而不是扫描

这是因为扫描读取数据库的每一项,而查询只查找提到的Hask键(主键)

如果您想查找具有特定“属性”的数据,可以使用全局二级索引,其中可以将“属性”设置为哈希键,同时选择一个排序键。这可能会解决表多次返回答案的问题


每当您想在DynamoDB数据库中搜索某些内容时,建议您使用查询选项,而不是扫描

这是因为扫描读取数据库的每一项,而查询只查找提到的Hask键(主键)

如果您想查找具有特定“属性”的数据,可以使用全局二级索引,其中可以将“属性”设置为哈希键,同时选择一个排序键。这可能会解决表多次返回答案的问题


下面是一个如何使用DynamoDB DocumentClient按分区键查询多个项目并收集结果的示例。这将使用
query()
调用的promisified变量,并等待使用
Promise.all()
实现所有查询承诺


下面是一个如何使用DynamoDB DocumentClient按分区键查询多个项目并收集结果的示例。这将使用
query()
调用的promisified变量,并等待使用
Promise.all()
实现所有查询承诺


因此,您只需要查询具有特定组织值的项目。
Org
是分区键吗?此外,您还误用了SDK函数。你在等待一些不是承诺的事情。你把承诺和回电混在一起了。您可以使用
const data=await dynamoClient.scan(params.promise()
,但是
scan
在这里是错误的解决方案。谢谢jarmod,几天前我意识到了这一点,我完全忘记了。您共享的代码是否也可以用于查询?我现在要测试它,但是我不在工作。是的,但是你需要多个查询,每个组织一个,假设组织确实是分区键(是吗?)是的,在这种情况下,我已经在for循环中运行scan,所以除了一条命令之外不需要修改任何东西。嘿,还有一个问题。你共享的代码,为什么它能工作?扫描是否返回回调而不是承诺?我对节点的异步功能非常模糊,所以您只想查询具有特定组织值的项。
Org
是分区键吗?此外,您还误用了SDK函数。你在等待一些不是承诺的事情。你把承诺和回电混在一起了。您可以使用
const data=await dynamoClient.scan(params.promise()
,但是
scan
在这里是错误的解决方案。谢谢jarmod,几天前我意识到了这一点,我完全忘记了。您共享的代码是否也可以用于查询?我现在要测试它,但是我不在工作。是的,但是你需要多个查询,每个组织一个,假设组织确实是分区键(是吗?)是的,在这种情况下,我已经在for循环中运行scan,所以除了一条命令之外不需要修改任何东西。嘿,还有一个问题。你共享的代码,为什么它能工作?扫描是否返回回调而不是承诺?我对节点的异步功能相当模糊