dynamodb - 扫描地图包含密钥的项目

时间:2016-03-22 11:10:36

标签: amazon-web-services amazon-dynamodb

我有一个包含字段(不是关键字段)的表,名为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"

正确的语法是什么?

感谢。

3 个答案:

答案 0 :(得分:2)

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

您可能会在示例中缺少此部分: ExpressionAttributeValues:{“:name”:{“S”:“Jeff”}}

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

与其他数据库不同,您必须使用Dynamo进行大量设置才能使其在高水平上运行,这是一个建议: 1)将其转换为根值,例如添加到root:qaExist,可能的值为0 | 1或true | false。 2)为新创建的值创建二级索引。 3)对新索引进行查询,将0指定为搜索参数。

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

答案 1 :(得分:1)

因为你对你的期望和发生的事情并不是有点模糊(“我试过这样的事情,但它不能按照我需要的方式工作”)我想提一下带过滤器的扫描与查询非常不同。

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

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

答案 2 :(得分:0)

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

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