#amazon-dynamodb #conditional-operator
#amazon-dynamodb #условный оператор
Вопрос:
Учитывая следующий код, я хотел бы предотвратить дубликаты, в которых ключ сортировки данной таблицы еще не имеет ключа сортировки, который начинается с ‘account_’:
db.put({
TableName: process.env.TABLE_NAME,
ConditionExpression: "NOT begins_with(SK,account_)",
Item: account
},function(err,data) {
if(err) {
callback(err,null);
} else {
callback(null,done(err,data));
}
});
Here's the table format
--------------------------------------
PK | SK | Attributes
user1@domain.com | account_123094| ...
user1@domain.com | account_239123| ... <-- ConditionalExpression should prevent
user2@domain.net | account_993422| ... <-- ConditionalExpression should allow
--------------------------------------
Как видно выше, мне нужно предотвратить дублирование, если PK уже существует или, более конкретно, если PK и SK не начинаются с ‘account_’. Что бы я ни пытался, я продолжаю получать дубликаты записей PK.
Ответ №1:
Если в вашем варианте использования должна быть только одна учетная запись, вы sk должны быть только account
вместо account_{someNumber}
.
В используемой вами структуре, если перед выполнением put вы проверяете, существует ли какой-либо объект с account_ *, и после этого выполняете вызов put. Но этого также будет недостаточно для выполнения данного условия.(вызов put могут выполнять два пользователя одновременно)
Комментарии:
1. Целью ‘account_{someNumber}’ является создание запроса в будущем для всех учетных записей с истекшим сроком действия. Где {someNumber} — это временная метка эпохи, когда срок действия учетной записи должен истечь. Затем я могу использовать запрос, чтобы найти все учетные записи с истекшим сроком действия после текущей даты / временной метки
2. ну, для этого вы в любом случае не можете использовать эту комбинацию pk, sk, поскольку это потребует от вас выполнения сканирования (чего вы должны стараться избегать всеми средствами). следовательно, это так же хорошо, как использовать другое поле для хранения времени истечения.