一般来说,我对 AppSync(和 GraphQL)很陌生,但是在将解析器连接到我们的 DynamoDB 表时遇到了一个奇怪的问题。具体来说,我们有一个嵌套 Map 结构用于我们任意构造的项目属性之一(其复杂性和形式取决于父项目的类型)——有点像这样:
"item" : {
"name": "something",
"country": "somewhere",
"data" : {
"nest-level-1a": {
"attr1a" : "foo",
"attr1b" : "bar",
"nest-level-2" : {
"attr2a": "something else",
"attr2b": [
"some list element",
"and another, for good measure"
]
}
}
},
"cardType": "someType"
}
Run Code Online (Sandbox Code Playgroud)
我们随附的 GraphQL 类型如下:
type Item {
name: String!
country: String!
cardType: String!
data: AWSJSON! ## note: it was originally String!
}
Run Code Online (Sandbox Code Playgroud)
当我们查询项目时,我们得到以下响应:
{
"data": {
"genericItemQuery": {
"name": "info/en/usa/bra/visa",
"country": "USA:BRA",
"cardType": …Run Code Online (Sandbox Code Playgroud) 问题和预期结果
我正在使用概念证明模式和 DynamoDB 表设置来过滤嵌套字段值。我在这里非常普遍地遵循了这些想法以及$utils.transform.toDynamoDBFilterExpression(这里)的文档。
基本思想是这样的:使用相同的原则,我想通过任何任意深度的嵌套字段(低于 DynamoDB 中的 32 个文档路径长度限制)进行过滤。相关设置如下所示:
AppSync 架构(对命名约定表示歉意;应该是一个快速而肮脏的 PoC):
query {
listActiveListingsBySubAndFilter(
filter: TableTestMasterDataTable_ImportV1FilterInput!,
limit: Int,
nextToken: String
): TestMasterDataTable_ImportV1Connection
}
input TableBooleanFilterInput {
ne: Boolean
eq: Boolean
}
input TableDataObjectFilterInput {
beds: TableFloatFilterInput
baths: TableFloatFilterInput
}
input TableFloatFilterInput {
ne: Float
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
contains: Float
notContains: Float
between: [Float]
}
input TableIDFilterInput {
ne: ID
eq: ID
le: ID
lt: ID
ge: …Run Code Online (Sandbox Code Playgroud)