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

Mis*_*r_L 7 amazon-web-services amazon-dynamodb

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

appsMap = { "qa-app": "abc", "another-app": "xyz" }
Run Code Online (Sandbox Code Playgroud)

我想扫描其appsMap包含密钥"qa-app"的所有行(值不重要,只是键).我试过这样的东西,但它不能按照我需要的方式工作:

    FilterExpression = '#appsMap.#app <> :v',
    ExpressionAttributeNames = {
        "#app": "qa-app",
        "#appsMap": "appsMap"
    },
    ExpressionAttributeValues = {
        ":v": { "NULL": True }
    },
    ProjectionExpression  = "deviceID"
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

谢谢.

Dmi*_*aev 5

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

您可能在示例中缺少这部分:ExpressionAttributeValues: {":name":{"S":"Jeff"}}

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

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

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


Mik*_*scu 2

由于您对自己的期望和正在发生的事情没有一点模糊(“我尝试了类似的方法,但它没有按照我需要的方式工作”),我想提一下,使用过滤器进行扫描是非常不同的比查询。

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

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