Создание, отсутствующее в записи элемента dynamodb

#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 здесь, не стесняйтесь создавать запрос на извлечение в репозитории или создавать выпуск для обсуждения ваших идей.