首页 文章

DynamoDB嵌套查询支持

提问于
浏览
12

Amazon DynamoDB扫描操作是否允许您查询 ArrayObject 类型的嵌套属性?例如,

{
    Id: 206,
    Title: "20-Bicycle 206",
    Description: "206 description",
    RelatedItems: [
        341, 
        472, 
        649
    ],
    Pictures: {
        FrontView: "123", 
        RearView: "456",
        SideView: "789"
    }
}

我可以查询 RelatedItems[2]Pictures.RearView 属性吗?

4 回答

  • 18

    是的,您可以使用Filter Expression,这就像条件表达式一样 . 在这些类型的表达式中可以使用的关于the functions的部分提到了以下内容:

    “对于嵌套属性,您必须提供其完整路径;有关更多信息,请参阅Document Paths . ”

    Document Paths引用提供了有关如何在_606087中引用嵌套属性的示例,例如List(您调用的是数组)和Map(您称之为对象) . 查看该参考以获取有关如何执行此操作的示例:

    • MyList [0]

    • AnotherList [12]

    • ThisList [5] [11]

    • MyMap.nestedField

    • MyMap.nestedField.deeplyNestedField

  • 1

    请注意,在DyanomoDB中 queryscan 是完全不同的( scan 是一个非常昂贵的操作) . 因此,虽然你可以按照@coffeeplease的指示对两者进行过滤;你只能查询/索引:

    索引的关键模式 . 索引键架构中的每个属性都必须是String,Number或Binary类型的顶级属性 . 不允许使用其他数据类型,包括文档和集合(参考) .

  • 5

    是的,您可以使用扫描或查询查询类型为array或object的嵌套属性 .

    Python boto3参考:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/dynamodb.html#querying-and-scanning

    示例:假设您要查找 RearView" > 500RelatedItems" > 200 的第二项的记录,您可以执行以下操作:

    data = table.scan(
        FilterExpression=Attr('RelatedItems[1]').gt('200') & Attr('Pictures.RearView').gt('500'))
    
  • 1

    是的,您可以通过传递列表或值 .

    data = table.scan(FilterExpression=Attr('RelatedItems').contains([1, 2, 3]) & Attr('Pictures.RearView').eq('1'))
    

相关问题