Amazon web services 有没有办法解决AWS DynamoDB中的嵌套属性,以便调用documentClient.query()呢?

Amazon web services 有没有办法解决AWS DynamoDB中的嵌套属性,以便调用documentClient.query()呢?,amazon-web-services,aws-lambda,amazon-dynamodb,Amazon Web Services,Aws Lambda,Amazon Dynamodb,我目前正在测试如何从AWS.DynamoDB.DocumentClient query()调用中设计一个查询,该调用接受params:DocumentClient.QueryInput,用于从DynamoDB中的表检索数据集合 当只处理字符串或数字类型的索引时,查询似乎很简单,工作正常。我不能做的是一个查询,它将使用有效的索引并对嵌套的属性进行筛选(请参见我的数据结构) 我使用的是FilterExpression,其中可以定义用于过滤的逻辑——除了尝试对嵌套属性进行过滤的情况外,这似乎在所有情况

我目前正在测试如何从AWS.DynamoDB.DocumentClient query()调用中设计一个查询,该调用接受params:DocumentClient.QueryInput,用于从DynamoDB中的表检索数据集合

当只处理字符串或数字类型的索引时,查询似乎很简单,工作正常。我不能做的是一个查询,它将使用有效的索引并对嵌套的属性进行筛选(请参见我的数据结构)

我使用的是FilterExpression,其中可以定义用于过滤的逻辑——除了尝试对嵌套属性进行过滤的情况外,这似乎在所有情况下都可以正常工作

当前参数,我正在用

parameters  {
  TableName: 'myTable',
  ProjectionExpression: 'HashKey, RangeKey, Artist ,#SpecialStatus, Message, Track, Statistics'
  ExpressionAttributeNames: { '#SpecialStatus': 'Status' },
  IndexName: 'Artist-index',
  KeyConditionExpression: 'Artist = :ArtistName',
  ExpressionAttributeValues: {
    ':ArtistName': 'BlindGuadian',
    ':Track': 'Mirror Mirror'
  },
  FilterExpression: 'Track = :Track'
}
数据DynamoDB表格中的结构:

{
'Artist' : 'Blind Guardian',
..
'Track': 'Mirror Mirror',
'Statistics' : [
   {
   'Sales': 42,
   'WrittenBy' : 'Kursch'
   }
]
}
假设我们希望通过在KeyConditionExpression中使用Artister从数据库中过滤掉所有条目。我们可以通过向艺术家输入:ArtistName来实现这一点。现在的问题是,如何检索我可以在写入时过滤的记录,它嵌套在统计数据中?

据我所知,除了字符串、数字或二进制之外,我们不能使用任何其他类型来制作二级索引。我也在尝试二级索引和排序键,但运气不好

我试过documentClient.scan(),同样的故事。仍然无法访问列表中的嵌套属性(FilterExpression只是不接受它)


我知道在“应用程序”端过滤结果的可能性,一旦检索到记录(例如艺术家),但我有兴趣在FilterExpression

中将其过滤掉。如果我正确理解您的问题,您希望创建一个查询来过滤复杂属性的值(在本例中为对象列表)

您可以通过索引到列表中来过滤列表的内容:

var params = {
    TableName: "myTable",
    FilterExpression: "Statistics[0].WrittenBy = :writtenBy",
    ExpressionAttributeValues: {
        ":writtenBy": 'Kursch'
    }
};
当然,如果你不知道具体的索引,这对你没有帮助

或者,您可以使用
CONTAINS
函数来测试列表中是否存在该对象。
CONTAINS
函数将要求对象中的所有属性与条件匹配。在这种情况下,您需要提供Sales和Writenby,这可能无法解决您的问题

数据的形状使访问模式难以实现,但DDB通常就是这种情况。您要求DDB支持对象列表的查询,其中对象具有特定属性和特定值。如您所见,这是一项棘手的工作。如您所知,让数据模型正确支持您r访问模式对DDB的成功至关重要。它也可能很难做到正确

有几个想法可以使您的访问模式更易于实现:

  • writenby
    移出复杂属性,并将其与其他顶级属性放在一起。这将允许您在
    writenby
    属性上使用简单的
    filtereexpression
  • 如果
    writenby
    属性必须保留在统计列表中,则将其单独设置(例如
    [{writenby:Kursch},{Sales:42},…]
    )。这样,您就可以在搜索中使用
    CONTAINS
    关键字
  • 使用PK或SK中的
    writenby
    字段创建二级索引(对于您的数据模型和访问模式有意义的)

如果我正确理解了您的问题,您希望创建一个查询来过滤复杂属性的值(在本例中是一个对象列表)

您可以通过索引到列表中来过滤列表的内容:

var params = {
    TableName: "myTable",
    FilterExpression: "Statistics[0].WrittenBy = :writtenBy",
    ExpressionAttributeValues: {
        ":writtenBy": 'Kursch'
    }
};
当然,如果你不知道具体的索引,这对你没有帮助

或者,您可以使用
CONTAINS
函数来测试列表中是否存在该对象。
CONTAINS
函数将要求对象中的所有属性与条件匹配。在这种情况下,您需要提供Sales和Writenby,这可能无法解决您的问题

数据的形状使访问模式难以实现,但DDB通常就是这种情况。您要求DDB支持对象列表的查询,其中对象具有特定属性和特定值。如您所见,这是一项棘手的工作。如您所知,让数据模型正确支持您r访问模式对DDB的成功至关重要。它也可能很难做到正确

有几个想法可以使您的访问模式更易于实现:

  • writenby
    移出复杂属性,并将其与其他顶级属性放在一起。这将允许您在
    writenby
    属性上使用简单的
    filtereexpression
  • 如果
    writenby
    属性必须保留在统计列表中,则将其单独设置(例如
    [{writenby:Kursch},{Sales:42},…]
    )。这样,您就可以在搜索中使用
    CONTAINS
    关键字
  • 使用PK或SK中的
    writenby
    字段创建二级索引(对于您的数据模型和访问模式有意义的)

Statistics
是一个对象还是一个数组?感谢您指出,统计应该是一个对象数组。我仍然不清楚您希望如何通过“WritenBy”进行筛选。您能更详细地描述它吗?一个例子会更好。为了更清楚,我应该使用更好的DB数据示例。比方说,我们需要从表中获取由“Kursch”编写的Artist=“Blind Guardian”的所有记录。在我的示例中(“我正在向查询提供的参数”部分),我正在使用Track筛选我感兴趣的记录-而且