我有一个表,其中包含一个字段(而不是关键字字段),名为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"正确的语法是什么?
谢谢。
发布于 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作为搜索参数。
这将使您的系统非常快,并且无论您稍后在其中获得多少记录,都具有很强的可扩展性。
发布于 2019-02-19 23:25:37
如果我理解正确,您可以执行以下操作:
FilterExpression = 'attribute_exists(#0.#1)',
ExpressionAttributeNames = {
"#0": "appsMap",
"#1": "qa-app"
},
ProjectionExpression = "deviceID"发布于 2016-03-24 01:35:26
既然你对你的期望和正在发生的事情一点也不含糊(“我尝试过这样的东西,但它不能以我需要的方式工作”),我想提一下,带过滤器的扫描与查询有很大的不同。
只有在执行扫描请求之后,才会在服务器上应用筛选器,这意味着它仍然会迭代表中的所有数据,并且不会返回每个项目,而是对每个响应应用一个筛选器,从而节省一些网络带宽,但当您在整个表中分页时,可能会返回空结果。
如果这是一个您希望经常运行的查询,那么您可以考虑在表上创建GSI。
https://stackoverflow.com/questions/36152826
复制相似问题