首页 > 解决方案 > AWS CLI dynamoDB 如何将变量传递给 get-item --key map

问题描述

我正在尝试遍历 userIds 列表以使用 AWS CLI 从 dynamoDB 表中检索记录。

// list.txt

abcdefghijklmnop1234567890123456
bbcdefghijklmnop1234567890123456
cbcdefghijklmnop1234567890123456
dbcdefghijklmnop1234567890123456
ebcdefghijklmnop1234567890123456

我运行get-itemaws 命令来检索单个记录:


$ aws dynamodb get-item --table-name "fake-table" --key '{"userId": {"S": "abcdefghijklmnop1234567890123456"}}'

它给了我想要的东西:

{
    "Item": {

        ...

        "userId": {
            "S": "abcdefghijklmnop1234567890123456"
        },

        "data": { ... }
    }
}

我现在正在尝试循环list.txt以将每个 id 作为变量传递给--key我理解为 map 和 json 形式的选项。

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/get-item.html

我的脚本如下所示:

while read LINE
do
    echo "$LINE"
    (aws dynamodb get-item --table-name "fake-table" --key '{"userId": {"S": $LINE}}') >> output.txt
done < list.txt

它抛出了这个错误:

Error parsing parameter '--key': Invalid JSON: Expecting value: line 1 column 22 (char 21)
JSON received: {"userId": {"S": $$LINE}}
abcdefghijklmnop1234567890123456

我尝试格式化原始列表,以便 userIds 用单引号括起来并收到相同的错误。

  1. 如何将变量传递到地图中?

我还想扩展搜索以仅返回具有数据的 userId 的记录。

  1. 我将如何扩展get-item搜索以检查数据是否不等于{}

我正在尝试在命令行中执行此操作来学习它。

我也打算在 node.js 中这样做。

标签: amazon-dynamodbcommand-line-interfaceaws-cli

解决方案


单引号阻止您的外壳(我假设是 bash 或类似的)扩展$LINE变量。相反,他们将其保留为文字值。请参阅bash 手册中的引用部分。

尝试将整个内容用双引号括起来,斜线转义那些需要格式化 JSON 值的内容:

aws dynamodb get-item --table-name "fake-table" --key "{\"userId\": {\"S\": $LINE}}" >> output.txt

推荐阅读