[英]createdAt missing in dynamodb item entry
我有一個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
的行為意味着不為此上下文創建新文檔。
至於可能的解決方案。 你有一個new
變量。 我很好奇你是如何定義那個變量的。 一種選擇是使用 get 調用檢查表並查看文檔是否已經存在。 如果你這樣做作為你的new
變量,它應該工作正常。 因為不存在就保存,如果已經存在,應該已經有createdAt
變量了。 這樣做的主要缺點是您必須始終在寫入之前執行讀取操作。 這增加了應用程序的延遲,並減慢了速度。 但它會實現你想要的。
現在。 如果您的表中的文檔沒有createdAt
時間戳(例如,您在 Dynamoose 之外創建它,或者您在添加時間戳選項之前創建它),上述解決方案將不起作用。 這是因為即使檢查它是否存在,也會導致運行update
方法,Dynamoose 假定這是更新而不是創建。 在這種情況下,任何解決方案實際上都取決於您的應用程序想要做什么。 該項目已經存在於表中,因此不可能知道真正的createdAt
時間戳是什么時候(除非您保留日志和所有這些)。 您可以對 go 運行一次操作,並將當前時間戳添加到createdAt
字段(如果每個文檔都沒有當前時間戳)(但同樣不會真正准確)。 或者你當然可以忽略它,而不是總是依賴那個領域。
總而言之,Dynamoose 中的時間戳功能是真正的客戶端功能。 Dynamoose 對數據 state 的了解有限,並且 DynamoDB 不提供內置的此功能。這意味着 Dynamoose 必須對如何處理這些情況做出假設。 但是,如果您遵循 Dynamoose 的時間戳模式(例如update
不會添加時間戳並且應該只用於更新現有項目、在 Dynamoose 中創建所有項目等),它將是完全准確的,並且您不會運行陷入任何這些陷阱。
如果您對如何提高 Dynamoose 的知識有任何創造性的解決方案,請隨時在 repo 上創建拉取請求或創建問題來討論您的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.