簡體   English   中英

使用 AWS AppSync 中的列表查詢 DynamoDB

[英]Querying DynamoDB with a list in AWS AppSync

我正在嘗試使用IN使用列表構建 AWS AppSync 查詢:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "my-index",
    "query" : {
        "expression": "id IN :ids",
        "expressionValues" : { ":ids" : $util.dynamodb.toStringSet($ctx.args.ids) }
    },
    "limit": $util.defaultIfNull(${ctx.args.first}, 20),
    "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.after, null))
}

但是,嘗試使用以下參數進行測試:

query ListItemsWithIdList {
  listItemsWithIdList(first:20, ids: ["id1", "id2"]) {
    items {
      id
    }
    nextToken
  }
}

它拋出一個錯誤:

Unable to parse the JSON document: 'Unexpected character ('S' (code 83)): was expecting double-quote to start field name
at [Source: (String)\"{
    \"version\" : \"2017-02-28\",
    \"operation\" : \"Query\",
    \"index\" : \"my-index\",
    \"query\" : {
        \"expression\": \"id IN :ids\",
        \"expressionValues\" : { \":ids\" : {SS=[id1, id2]} }
    },       
    \"limit\": 20,
    \"nextToken\": null
}\"; line: 7, column: 47]'"

IN用於查詢比較運算符似乎可以; 但是,如何將String List作為參數傳遞並獲取 ID 位於所提供參數中的結果?

編輯:更正了變量名拼寫錯誤。

我認為 AWS AppSync 暫時不支持IN 我嘗試測試您的場景並提出使用contains()函數的解決方案。

在此處輸入圖片說明

查詢后的結果如下:

在此處輸入圖片說明

另一種替代解決方案是使用Scan (不推薦)

{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "filter" : {
        "expression": "contains (:authors, author)",
        "expressionValues" : {
            ":authors" : $util.dynamodb.toDynamoDBJson($ctx.args.authors)
        }
    }
}

順便說一句,AWS AppSync 支持BatchGetItem操作。 您可以在單個查詢中傳遞鍵列表並從表中返回結果。
參考: https : //docs.aws.amazon.com/appsync/latest/devguide/tutorial-dynamodb-batch.html
這是一個例子,我測試了它的魅力:

## REQUEST MAPPING
#set($authors = [])
#foreach( $author in $ctx.args.authors )
    #set($map = {})
    $util.qr($map.put("author", $util.dynamodb.toString($author)))
    $util.qr($authors.add($map))
#end

{
    "version" : "2018-05-29",
    "operation" : "BatchGetItem",
    "tables" : {
        "tbDiary": {
            "keys": $util.toJson($authors),
            "consistentRead": true
        }
    }
}

## RESPONSE MAPPING
$util.toJson($ctx.result.data.tbDiary)

我認為這里可能有兩個問題:

  • listItemsWithIdList查詢中的參數接受名為userIds的參數。 您的解析器模板中有$ctx.args.ids) 您需要在兩個地方使用相同的參數名稱。

  • 當您在映射模板中使用$util.dynamodb.toStringSet時,就像您在錯誤中看到的那樣,它會轉換為{ \\":ids\\" : {SS=[id1, id2]} } 但是,您希望將 id 值包含在引號中。 AWS AppSync 為此提供了另一種實用方法。 您可以更改模板以使用$util.dynamodb.toStringSetJson ,然后將其轉換為{ \\":ids\\" : {SS=[\\"id1\\", \\"id2\\"]} }

讓我知道這是否解決了您的問題。 這是對解析器映射模板實用程序的參考

希望你已經解決了。 但是,您的設置有兩個問題:

這必須是一個過濾器表達式,並且由於您沒有關鍵條件,這甚至可能必須是掃描而不是查詢

然后是語法問題(這是錯誤的真正原因):在 EXPRESSION 中,將括號添加到變量“表達式”:“id IN (:ids”),

在表達式值中使用 toStringSetJson 而不是 toStringSet "expressionValues" : { ":ids" : $util.dynamodb.toStringSetJson($ctx.args.ids) }

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM