我有一个字段,我在模型中声明为字符串,如下所示:
App.Student= DS.Model.extend({
name: DS.attr('string'),
address1: DS.attr('string'),
address2: DS.attr('string'),
city: DS.attr('string'),
state: DS.attr('string'),
postal: DS.attr('string'),
country: DS.attr('string'),
});
此处在编辑模式下,当我将Adderess 2字段更新为null时,会出现以下错误:
"Failed to edit property: One or more parameter values were invalid: An AttributeValue may not contain an empty string"
我知道这个错误是生成的,因为我将地址2字段更新为null并且我想要地址2字段不是必需的(可以传递数据或者也可以将该列保留为空白“)
答案 0 :(得分:2)
最后,我做对了,方式可能有些不同,但它对我有用!!!
以下是相同的代码。
AttributeUpdates: {
Address2:
{
Action: "DELETE"
},
}
然后我在条件上添加了值。
if (propertyObj.address2) {
params.AttributeUpdates.address2 = {
Value: {
S: propertyObj.address2
},
Action: "PUT"
}
}
衷心感谢所有人:)谁试图帮助我,干杯!!!
答案 1 :(得分:1)
您可以使用AttributeValue null类型作为占位符。如果你不能改变类型,那么,选择一个标记值,如" ZZZZZ"或类似的,并使其代表空字符串。或者,您的模型可能只有一个地址字段,然后,如果第二个地址行为空/空,则可以对address1中的两个地址行进行编码。
答案 2 :(得分:1)
我只是传递空值。这是我的NodeJS脚本,用于将数据从文件加载到DynamoDB中,我只使用三元组来避免空字符串。
Objects > users (the users object I created)
答案 3 :(得分:1)
如果您使用的是DynamoDB(不是DocumentClient),则可以指定空值
const putItem: PutItemInput = {
TableName: `${process.env.PRIMARY_TABLE}`,
Item: {
key: { S: ${userId}` },
someField: { NULL: true }
}
}
答案 4 :(得分:1)
AWS终于解决了这个问题。 DynamoDb现在为非关键属性支持空字符串值:https://aws.amazon.com/about-aws/whats-new/2020/05/amazon-dynamodb-now-supports-empty-values-for-non-key-string-and-binary-attributes-in-dynamodb-tables/
答案 5 :(得分:0)
我认为最好的方法是检查字段的值是否为空,而不将值保存在数据库中。
当该字段为空白时,我们不应将其包括在属性值映射中。
这是我用GO语言使用的代码段
myAttributeValues := map[string]*dynamodb.AttributeValue{
“field1”: {
S: aws.String(value1),
},
“field2”: {
S: aws.String(value2),
},
“field3”: {
S: aws.String(value3),
},
}
if field4 != "" {
field4Attribute := dynamodb.AttributeValue{
S: aws.String(value4),
}
myAttributeValues[“field4”] = &field4Attribute
}
if field5 != "" {
field5Attribute := dynamodb.AttributeValue{
S: aws.String(value5),
}
myAttributeValues["field5"] = &field5Attribute
}
input := &dynamodb.PutItemInput{
TableName: aws.String(mytableName),
Item: myAttributeValues,
}
答案 6 :(得分:0)
自DynamoDB is NoSQL起,您可以采用完全不同的方式来查看它:
不是试图在DynamoDB中添加“空” /空值,而是计划不尝试首先使用“空”值添加属性本身... >
“空”-检入代码,而不是检查[em]属性本身是否存在(按属性名称):
请注意我在上面的“ null”上使用引号-我这样做是为了强调,如果您使用这种通过不映射其属性本身来表示null的想法,那么实际上没有 以“ null”形式存在(没有 actually 持有 actual “ null”值的属性)。
*除了以这种方式本身可以捕获“空”检查的好处外,该策略还具有节省[至少一些] DynamoDB存储空间和读取/写入容量单位的额外好处 strong>(即on-demand pricing将1个写入单位限制为1kb,将1个读取单位限制为4kb):没有存储表示“空”的属性,意味着没有其他存储空间!我不是一个事实,但是我猜想亚马逊是故意做出AWS架构设计选择的,以强制执行以下决策/权衡:在{无空值,无空集}之类的约束下进行操作,并节省原本会存在的资源。花在他们身上。
再次,由于DynamoDB的NoSQL实现,一切皆有可能-与 SQL 数据库不同, NoSQL数据可以非结构化;特别是在这种情况下,可以利用非结构化性在给定DynamoDB表中的某些文档中 include 以及在同一表中的 not 其他文档中 include 。在SQL数据库中不可能做类似的事情,因为每个数据库行必须具有 all 列-这就是必须将SQL变量/列设置为null
的原因,需要“无值”(请注意我在这句话中null
的不同格式),而不能仅在该行上“不包括列/变量”。通过仅不包含属性(因为NoSQL是非结构化 :)之所以可以做到,NoSQL的“在某些行上不包括列”的版本是可能的
*尽管有Amazon DynamoDB now supports empty values for non-key String and Binary attributes的事实,该策略仍可用于收益-该策略至少仍具有节省空间的优势。
* 请注意,此策略也可以用于表示“空集” (因为DynamoDB中的集必须至少具有1个值)-请仅在映射到set属性之前,希望它是非空的;)
[可以在similar discussion for MongoDB中阅读此策略]