我正在尝试遍历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括在单引号中并收到相同的错误。
我还想扩展搜索范围,使其仅返回具有数据的userId的记录。
get-item
的搜索以检查数据是否等于{}
?我正在尝试在命令行中学习它。
我也打算在node.js中这样做。
答案 0 :(得分:1)
单引号阻止您的shell(我假设是bash或类似的东西)扩展$LINE
变量。相反,他们将其保留为文字值。请参阅bash manual中的“报价”部分。
请尝试将整个内容括在双引号中,并用斜杠将要格式化JSON值的内容转义:
aws dynamodb get-item --table-name "fake-table" --key "{\"userId\": {\"S\": $LINE}}" >> output.txt
答案 1 :(得分:0)
原来是@MilanCermak指出的单引号。
循环的目的是从列表中提取相关的用户记录(总计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