首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >dynamodb -扫描map包含键的项目

dynamodb -扫描map包含键的项目
EN

Stack Overflow用户
提问于 2016-03-22 19:10:36
回答 3查看 10.5K关注 0票数 8

我有一个表,其中包含一个字段(而不是关键字字段),名为appsMap,如下所示:

代码语言:javascript
运行
复制
appsMap = { "qa-app": "abc", "another-app": "xyz" }

我想扫描appsMap包含键"qa-app“的所有行(值并不重要,重要的是键)。我试过这样的东西,但它不能以我需要的方式工作:

代码语言:javascript
运行
复制
    FilterExpression = '#appsMap.#app <> :v',
    ExpressionAttributeNames = {
        "#app": "qa-app",
        "#appsMap": "appsMap"
    },
    ExpressionAttributeValues = {
        ":v": { "NULL": True }
    },
    ProjectionExpression  = "deviceID"

正确的语法是什么?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2016-03-26 02:01:53

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

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

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

与其他数据库不同的是,你必须使用Dynamo做大量的设置,以便让它在很好的水平上执行,这里有一个建议: 1)将其转换为根值,例如添加到根目录: qaExist,可能的值为0|1或true|false。2)为新创建的值创建二级索引。3)在新的索引上进行查询,指定0作为搜索参数。

这将使您的系统非常快,并且无论您稍后在其中获得多少记录,都具有很强的可扩展性。

票数 4
EN

Stack Overflow用户

发布于 2019-02-19 23:25:37

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

代码语言:javascript
运行
复制
FilterExpression = 'attribute_exists(#0.#1)',
ExpressionAttributeNames = {
    "#0": "appsMap",
    "#1": "qa-app"
},
ProjectionExpression  = "deviceID"
票数 2
EN

Stack Overflow用户

发布于 2016-03-24 01:35:26

既然你对你的期望和正在发生的事情一点也不含糊(“我尝试过这样的东西,但它不能以我需要的方式工作”),我想提一下,带过滤器的扫描与查询有很大的不同。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36152826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档