dynamodb 项目条目中缺少 createdAt

createdAt missing in dynamodb item entry

我有一个 dynamodb table,我使用 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 时,它应该有 both createdAtupdatedAt 字段。

所以当我 运行 我的代码看起来像这样时

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 管理控制台中的 inserted/updated 数据时,没有 createdAt,只有 updatedAt。按理说我也应该有 createdAt 对吧?如果没有,如何确保 createdAt 永远存在?

基于发帖人的评论。看起来这只发生在 update 调用中。

原始问题中相当 的信息不足以让我就我认为最好的解决方案给出具体答案。因此,我将做出一些假设,并提供有关 Dynamoose 如何处理这种情况的大量高级细节。

稍微介绍一下幕后情况,这将有助于使我的回答更加清楚。从 Dynamoose 的角度来看,它不知道 document/item 是否已经存在于数据库中。这导致 createdAt 很难达到 100% 准确的情况。您 运行 正在陷入其中一种情况。对于 update 调用,Dynamoose 假定文档已经存在,因此不会设置 createdAt 时间戳。这是有道理的,因为 createdAtupdate 调用并不真正匹配。但是,DynamoDB 和 Dynamoose 在技术上允许使用 update 创建一个新的 document/item。但是 Dynamoose 无法知道它是哪个,所以我们使用假设 update 意味着不为此上下文创建新文档的行为。

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

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

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

如果您对如何提高 Dynamoose 的知识有任何创造性的解决方案,请随时在 repo 上创建拉取请求或创建问题来讨论您的想法。