我有一个使用dynamoose
声明的dynamodb
表,如下所示:
const schema = new dynamoose.Schema({
"email": String,
"name": String,
"vehicleMotor": {
"type": Number,
"default": 0
},
"vehicleMotorId": String,
"vehicleMotorImage1File": String,
"vehicleMotorImage2File": String,
}, {
"saveUnknown": true,
"timestamps": true
});
根据我的理解,当我声明了"timestamps": true
时,它应该同时具有createdAt
和updatedAt
字段。
所以当我运行我的代码时,它看起来像这个
if (new){
const newSeller = new Seller({
"email": email,
"name": name
})
var saveResult = await newSeller.save();
}else{
var updateResult = await Seller.update( { "email": email, sellerType: 1 }, {
"name": name
})
}
当我在AmazonDynamoDB管理控制台中检查插入/更新的数据时,没有createdAt
,只有updatedAt
。对了,我也应该有createdAt
对吧?如果没有,如何确保createdAt
始终存在?
基于原始海报的评论。这似乎只发生在update
调用中。
最初的问题中没有足够的信息让我具体回答我认为什么是最好的解决方案。因此,我将做一些假设,并给出许多关于迪纳摩如何处理这种情况的高层细节。
只是一点点幕后故事,这将有助于我的答案更加清晰。从Dynamose的角度来看,它不知道文档/项是否已经存在于数据库中。这导致CCD_ 11难以获得100%准确度的情况。您正遇到其中一种情况。对于update
调用,Dynamose假定文档已经存在,因此不设置createdAt
时间戳。这是有道理的,因为createdAt
与update
调用并不真正匹配。然而,DynamoDB&Dynamose在技术上允许使用update
创建新的文档/项目。但是Dynamose无法知道它是哪一个,所以我们使用假设update
意味着不为此上下文创建新文档的行为。
至于可能的解决方案。您有一个new
变量。我很好奇你是如何定义这个变量的。一种选择是使用get调用检查表,看看文档是否已经存在。如果您将其作为new
变量来执行,那么它应该可以正常工作。因为如果它不存在,它会保存,如果它已经存在,它应该已经有了createdAt
变量。这样做的主要缺点是,在编写之前必须始终进行读取操作。这增加了应用程序的延迟,并降低了速度。但它会实现你想要的。
现在。如果表中的文档没有createdAt
时间戳(例如,您在Dynamose之外创建了它,或者您在添加时间戳选项之前创建了它(,则上述解决方案将不起作用。这是因为,即使检查它是否存在,也会导致update
方法运行,Dynamose认为它是一个更新,而不是一个创建。在这种情况下,任何解决方案实际上都取决于您的应用程序想要做什么。该项已经存在于表中,因此不可能知道truecreatedAt
时间戳是什么时候(除非您保留日志等(。如果createdAt
字段没有针对每个文档的时间戳,您可以运行一次操作来遍历并将当前时间戳添加到该字段中(但这也不是真正准确的(。或者你当然可以忽略它,而不是总是依赖于那个领域。
总之,Dynamose中的时间戳功能实际上是一个客户端功能。Dynamose对数据状态的了解有限,DynamoDB没有提供内置的功能。这意味着Dynamose必须对如何处理这些情况做出假设。然而,如果您遵循Dynamose的时间戳模式(例如,update
不会添加时间戳,只应用于更新现有项目、在Dynamose中创建所有项目等(,它将是完全准确的,您不会遇到任何这些陷阱。
如果你有任何创造性的解决方案来提高Dynamose在这里的知识,请随时在回购上创建一个拉取请求或创建一个问题来讨论你的想法。