如何过滤NULL?

时间:2019-04-29 06:42:10

标签: amazon-dynamodb

"order (S)","method (NULL)","time (L)"
"/1553695740/Bar","true","[  { ""N"" : ""1556593200"" },  { ""N"" : ""1556859600"" }]"
"/1556439461/adasd","true","[  { ""N"" : ""1556593200"" },  { ""N"" : ""1556679600"" }]"
"/1556516482/Foobar","cheque","[  { ""N"" : ""1556766000"" }]"

如何在空的“方法”属性值上扫描或查询该问题? https://s.natalian.org/2019-04-29/null.mp4

2 个答案:

答案 0 :(得分:1)

我很确定没有任何方法可以使用控制台进行过滤。但是我猜测您真正想要的是在代码中使用这种过滤器。

DynamoDB具有一种非常特殊的存储NULL的方式。有一个“ NULL”数据类型,它基本上表示空值的 concept 概念,但实际上有点像布尔值。

如果有机会将该属性的数据类型更改为字符串或数字,我强烈建议您这样做。然后,您将能够使用过滤条件创建更强大的查询,以匹配所需的条件。

如果数据已经存在并且您没有大量需要更新的项目,建议您创建一个新属性来表示数据和回填。

只需跟进评论。如果您更喜欢使用映射器,则可以自定义它如何封送某些可能为空/空的属性。看看go sdk编码器的实现示例:https://git.codingcafe.org/Mirrors/aws/aws-sdk-go/blob/9b5aaeba7a51edcf3f87bda525a08b04b90d2ef8/service/dynamodb/dynamodbattribute/encode.go

答案 1 :(得分:1)

不幸的是,DynamoDB控制台提供了一个简单的GUI,并假定您要执行的所有操作都具有相同的类型。当您在类型为“ NULL”的列上选择过滤器时,它仅允许您做存在或不存在。这是有道理的,因为仅包含NULL数据类型的列可以存在或不存在。

这里的内容是包含多个数据类型的列(因为NULL是不同于String的数据类型)。有很多方法可以过滤您想要的内容,但我认为控制台上不提供这些方法。这是一个有关如何通过AWS CLI过滤数据集的示例(注意:由于您的列是命名保留字method,因此您需要使用表达式属性名称对其进行别名):

使用过滤器表达式

$ aws dynamodb scan --table-name plocal --filter-expression '#M = :null' --expression-attribute-values '{":null":{"NULL":true}}' --expression-attribute-names '{"#M":"method"}'

要避免这种情况的一种选择是在将数据写入数据库时​​(例如,“无”或“不适用”),更新逻辑以写入某种排序填充字符串值,而不是空字符串或空字符串。 。然后,您可以只对字符串进行操作,然后搜索该值。

DynamoDB当前不允许空字符串的String值,如果尝试直接放置这些项目,则会给您错误。为了使此操作“更轻松”,许多SDK已为DyanmoDB项目提供了对象的映射器/转换器,这通常涉及将空字符串转换为Null类型,以解决没有空字符串的规则。

如果您需要区分null"",则需要编写一些自定义逻辑以将空字符串编组/解组为唯一的字符串值(即"__EMPTY_STRING")存储在DyanmoDB中。