我有一个包含字段(不是关键字段)的表,名为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"
正确的语法是什么?
感谢。
答案 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"