【问题标题】:dynamodb - scan items where map contains a keydynamodb - 扫描地图包含密钥的项目
【发布时间】:2019-02-19 23:25:36
【问题描述】:

我有一个包含一个字段(不是关键字段)的表,称为 appsMap,它看起来像这样:

appsMap = { "qa-app": "abc", "another-app": "xyz" }

我想扫描所有appsMap 包含键“qa-app”的行(值不重要,只是键)。我尝试了这样的事情,但它没有按我需要的方式工作:

    FilterExpression = '#appsMap.#app <> :v',
    ExpressionAttributeNames = {
        "#app": "qa-app",
        "#appsMap": "appsMap"
    },
    ExpressionAttributeValues = {
        ":v": { "NULL": True }
    },
    ProjectionExpression  = "deviceID"

正确的语法是什么?

谢谢。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    这里有一个关于这个主题的讨论: https://forums.aws.amazon.com/thread.jspa?threadID=164470

    您可能在示例中遗漏了这一部分: ExpressionAttributeValues: {":name":{"S":"Jeff"}}

    但是,只是想回应已经说过的话,扫描是一个昂贵的过程,它会遍历每个项目,从而使您的数据库难以扩展。

    与其他数据库不同,您必须对 Dynamo 进行大量设置才能使其发挥出色的性能,这里有一个建议: 1) 将其转换为根值,例如添加到根:qaExist,可能值为 0|1 或 true|false。 2)为新创建的值创建二级索引。 3) 对新索引进行查询,指定 0 作为搜索参数。

    这将使您的系统非常快速且非常可扩展,无论您以后获得多少记录。

    【讨论】:

      【解决方案2】:

      如果我对问题的理解正确,您可以执行以下操作:

      FilterExpression = 'attribute_exists(#0.#1)',
      ExpressionAttributeNames = {
          "#0": "appsMap",
          "#1": "qa-app"
      },
      ProjectionExpression  = "deviceID"
      

      【讨论】:

      • 这是我一直在寻找的解决方案,谢谢!
      【解决方案3】:

      由于您对自己的期望和正在发生的事情并没有含糊其辞(“我尝试过这样的事情,但它没有按我需要的方式工作”)我想提一下带有过滤器的扫描与查询非常不同。

      过滤器仅在执行扫描请求后应用在服务器上,这意味着它仍会遍历表中的所有数据,而不是返回每个项目,而是对每个响应应用过滤器,从而为您节省一些网络带宽,但可能会在您翻阅整个表格时返回空结果。

      如果这是您希望经常运行的查询,您可以考虑在表上创建 GSI。

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 2018-04-06
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        相关资源
        最近更新 更多