#amazon-dynamodb #dynamoose
#amazon-dynamodb #dynamoose
Вопрос:
У меня есть 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
, что он всегда будет там?
Комментарии:
1. Происходит ли это только для
update
вызова (new
значение false) или только вsave
вызове (`new равно true) или и то, и другое?2. Это происходит только для
update
вызова (new
в false)
Ответ №1:
На основе комментария с оригинального плаката. Похоже, это происходит только для update
вызова.
В исходном вопросе недостаточно информации, чтобы я мог дать конкретный ответ относительно того, что я считаю лучшим решением. Итак, я собираюсь сделать несколько предположений и подробно рассказать о том, как Dynamoose справляется с этой ситуацией.
Просто немного за кулисами, которые помогут сделать мой ответ более понятным. С точки зрения Dynamoose, он понятия не имеет, существует ли документ / элемент уже в базе данных или нет. Это приводит к ситуации, когда createdAt
трудно получить точность на 100%. Вы сталкиваетесь с одной из этих ситуаций. Для update
вызова Dynamoose предполагает, что документ уже существует, и поэтому не устанавливает временную createdAt
метку. Это имеет смысл, потому createdAt
что на самом деле не соответствует update
вызову. Однако DynamoDB и Dynamoose технически позволяют использовать update
для создания нового документа / элемента. Но Dynamoose не имеет возможности узнать, что это такое, поэтому мы используем поведение, предполагающее update
, что означает не создавать новый документ для этого контекста.
Что касается возможного решения. У вас есть new
переменная. Мне любопытно, как вы определяете эту переменную. Одним из вариантов было бы проверить таблицу с помощью вызова get и посмотреть, существует ли документ уже. Если вы сделаете это в качестве своей new
переменной, она должна работать нормально. Поскольку он сохранится, если он не существует, и если он уже существует, у него уже должна быть createdAt
переменная. Основным недостатком этого является то, что вы всегда должны выполнять операцию чтения перед записью. Что увеличивает задержку приложения и замедляет работу. Но он достигнет того, чего вы хотите.
Теперь. В случае, если в вашей таблице есть документы, у которых нет createdAt
метки времени (например. вы создали его вне Dynamoose, или вы создали его перед добавлением опции timestamp), вышеупомянутое решение не будет работать. Это связано с тем, что даже проверка того, существует ли он, приведет к update
запуску метода, который Dynamoose считает обновлением, а не созданием. В этом случае любое решение действительно зависит от того, что хочет сделать ваше приложение. Элемент уже существует в таблице, поэтому невозможно узнать, когда была истинная createdAt
временная метка (если вы не ведете журналы и все такое). Вы можете выполнить одноразовую операцию для прохождения и добавления текущей временной метки в createdAt
поле, если она отсутствует для каждого документа (но опять же, это не будет действительно точным). Или, конечно, вы могли бы просто проигнорировать это и не всегда полагаться на это поле.
Подводя итог, функция временных меток в Dynamoose действительно является функцией на стороне клиента. Dynamoose имеет ограниченное представление о состоянии данных, а DynamoDB не предоставляет встроенную функциональность. Это означает, что Dynamoose должен делать предположения о том, как обращаться с этими ситуациями. Однако, если вы будете следовать шаблонам Dynamoose для временных меток (например, update
не будете добавлять временную метку и должны использоваться только для обновления существующих элементов, создания всех элементов в Dynamoose и т. Д.), Это будет абсолютно точно, И вы не столкнетесь ни с одной из этих ошибок.
Если у вас есть какие-либо творческие решения о том, как улучшить знания Dynamoose здесь, не стесняйтесь создавать запрос на извлечение в репозитории или создавать выпуск для обсуждения ваших идей.