AWS CLI dynamoDB如何将变量传递给get-item --key map

时间:2019-02-15 15:19:10

标签: amazon-dynamodb command-line-interface aws-cli

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

// list.txt

abcdefghijklmnop1234567890123456
bbcdefghijklmnop1234567890123456
cbcdefghijklmnop1234567890123456
dbcdefghijklmnop1234567890123456
ebcdefghijklmnop1234567890123456

我运行了get-item aws命令来检索一条记录:


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

它给了我我想要的东西:

{
    "Item": {

        ...

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

        "data": { ... }
    }
}

我现在正试图遍历list.txt,以将每个id作为变量传递给--key选项,我理解它是一个映射,并且为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

我尝试格式化原始列表,以便将userId括在单引号中并收到相同的错误。

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

我还想扩展搜索范围,使其仅返回具有数据的userId的记录。

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

我正在尝试在命令行中学习它。

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

2 个答案:

答案 0 :(得分:1)

单引号阻止您的shell(我假设是bash或类似的东西)扩展$LINE变量。相反,他们将其保留为文字值。请参阅bash manual中的“报价”部分。

请尝试将整个内容括在双引号中,并用斜杠将要格式化JSON值的内容转义:

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

答案 1 :(得分:0)

  1. 原来是@MilanCermak指出的单引号。

  2. 循环的目的是从列表中提取相关的用户记录(总计12,000),但是每次查询数据库都非常耗时。拉取所有(550,000)dynamoDB记录并使用python脚本进行操作更快。

aws dynamodb scan --table-name "fake-table" \
  --projection-expression "userId" \
  --max-items 550000 --page-size 90 --region xx-xxx-1 \
  | python reformat_list.py > results.csv

我爱这个问题0_0