Amazon dynamodb dynamodb项目条目中缺少createdAt

Amazon dynamodb dynamodb项目条目中缺少createdAt,amazon-dynamodb,dynamoose,Amazon Dynamodb,Dynamoose,我有一个dynamodb表,我使用dynamoose声明如下: const schema = new dynamoose.Schema({ "email": String, "name": String, "vehicleMotor": { "type": Number, "default": 0 }, "vehic

我有一个
dynamodb
表,我使用
dynamoose
声明如下:

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
    })
}

当我检查Amazon DynamoDB管理控制台中插入/更新的数据时,没有
createdAt
,只有
updatedAt
。当然,我也应该有
createdAt
对吗?如果没有,如何确保
createdAt
始终存在?

基于原始海报的评论。看起来这只发生在
update
调用中

原始问题中没有足够的信息让我具体回答我认为最好的解决方案是什么。所以我将做一些假设,并给出许多关于Dynamoose如何处理这种情况的高级细节

只是一点幕后活动,这将有助于让我的答案更清楚。从Dynamoose的角度来看,它不知道数据库中是否已经存在文档/项。这导致
createdAt
很难获得100%的准确度。您正遇到这些情况之一。对于
update
调用,Dynamoose假设文档已经存在,因此不设置
createdAt
时间戳。这是有意义的,因为
createdAt
实际上与
update
调用不匹配。但是,DynamoDB&Dynamoose技术上允许使用
update
创建新文档/项目。但是Dynamoose无法知道它是哪个,所以我们使用假设
update
的行为意味着不为此上下文创建新文档

至于可能的解决办法。您有一个
新的
变量。我很好奇你是如何定义这个变量的。一个选项是使用get调用检查表,查看文档是否已经存在。如果您将其作为
新的
变量,那么它应该可以正常工作。因为如果它不存在,它将保存,如果它已经存在,它应该已经有
createdAt
变量。这样做的主要缺点是,在写入之前,您必须始终执行读取操作。这会增加应用程序的延迟,并降低速度。但它会实现你想要的

现在。如果表中的文档没有
createdAt
时间戳(例如,您在Dynamoose之外创建了它,或者在添加时间戳选项之前创建了它),则上述解决方案将不起作用。这是因为,即使检查它是否存在,也会导致运行
update
方法,Dynamoose假定该方法是更新而不是创建。在这种情况下,任何解决方案实际上都取决于应用程序想要做什么。该项已经存在于表中,因此不可能知道true
createdAt
时间戳是什么时候(除非您保留日志和所有这些)。如果每个文档都没有当前时间戳,您可以运行一次性操作来检查并将其添加到
createdAt
字段中(但这也不是真正准确的)。或者你当然可以忽略它,而不是总是依赖于这个领域

总之,Dynamoose中的时间戳特性确实是客户端特性。Dynamoose对数据状态的了解有限,DynamoDB不提供内置的此功能。这意味着Dynamoose必须对如何处理这些情况做出假设。但是,如果您遵循Dynamoose的时间戳模式(例如,
update
不会添加时间戳,并且应该仅用于更新现有项目、在Dynamoose中创建所有项目等),它将是完全准确的,并且您不会遇到任何这些陷阱


如果您对如何提高Dynamoose的知识有任何创造性的解决方案,请随时创建回购请求或创建一个问题来讨论您的想法。

这是仅针对
更新
调用(
new
为假)还是仅在
保存
调用(`new is true)中发生的或者两者都有?仅在调用
更新
时发生(
新建
为false)