簡體   English   中英

AppSync/GraphQL 過濾嵌套對象

[英]AppSync/GraphQL filter nested objects

我有一個具有以下結構的 DynamoDB 表

site           (String)
addresses      (List)
 |-> address   (String)
 |-> isCurrent (Boolean)

我想為當前或所有地址過濾特定站點。

query MyQuery {
  getSite(site: "site1", isCurrent: true) {
    site
    addresses{
       adress
       isCurrent
    }

模式看起來像

type Sites{
site: String!
addresses: [Address]
}

type Address {
address: String
isCurrent: Boolean
}

type Query{
getSite(site: String!, isCurrent:Boolean)
}

我有的解析器

#if($ctx.args.isCurrent)
{
    "version": "2017-02-28",
    "operation": "Query",
    "query": {. // Filter for specific Site
        "expression": "#siteName = :siteNameByUser",
        "expressionNames": {
            "#siteName": "site"
        },
        "expressionValues": {
            ":siteNameByUser": {"S": $util.toJson($ctx.args.site)}
        }
    }, // Filter Current Address(s)
        "filter": {
        "expression": "addresses.isCurrent = :isActiveByUser",
        "expressionValues": {
            ":isActiveByUser": $util.dynamodb.toDynamoDBJson($ctx.args.isCurrent)      
    }
  }
}
#else
{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "site": $util.dynamodb.toDynamoDBJson($ctx.args.site)
    }
}
#end

添加過濾器時我沒有得到任何結果(它在沒有過濾器或使用 isCurrent=False 的情況下工作)。 我正在嘗試根據用戶為 isCurrent 發送的值過濾Addresses列表中的內部對象。 任何幫助深表感謝!

我嘗試編寫一個帶有內部值 (addresses.isCurrent) 過濾條件的解析器。

{
    "version": "2017-02-28",
    "operation": "Query",
    "query": {. // Filter for specific Site
        "expression": "#siteName = :siteNameByUser",
        "expressionNames": {
            "#siteName": "site"
        },
        "expressionValues": {
            ":siteNameByUser": {"S": $util.toJson($ctx.args.site)}
        }
    }, // Filter Current Address(s)
        "filter": {
        "expression": "addresses.isCurrent = :isActiveByUser",
        "expressionValues": {
            ":isActiveByUser": $util.dynamodb.toDynamoDBJson($ctx.args.isCurrent)      
    }
  }
}

顯然,DynamoDB 不允許您過濾復雜的 object 類型,例如地圖列表(您的情況),請參閱相關問題: DynamoDB: How to store a list of items

如果可能,我建議將您的 DynamoDB 表數據 model 更改為site , address , isCurrentAddress以實現您想要做的事情。 或者您可以在 VTL 響應映射模板中編寫邏輯,以根據 isCurrentAddress 值過濾結果集。 順便說一句,AppSync 最近推出了JavaScript 解析器,go,看看這是否有助於更簡單地編寫解析器邏輯。

暫無
暫無

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

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