Можно ли атомарно добавить несколько элементов в массив DynamoDB с проверкой их наличия в нем (чтобы избежать дублирования)? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть черный список электронной почты, сохраненный как один элемент в DynamoDB

// item example
{
  id: "blackList" // PrimaryKey of item
  list: [ "email_1@example.com", "email_2@example.com" ]
}

Возможно добавить новое электронное письмо в список и в то же время проверить, если оно еще не представлено в списке (чтобы избежать дублирования)) при атомарном обновлении:

const email = "email_new@example.com";
const params = {
    TableName: "myTable",
    Key: {
        id: "blackList"
    },
    AttributeUpdates: {
        list: {
          Action: "ADD",
          Value: [email] // several emails can also be added with incorrect Expected check
        },
    },
    Expected: {
        list: {
            ComparisonOperator: "NOT_CONTAINS",
            Value: email
        },
    }
};

await docClient.update(params).promise();

Вопрос в том, возможно ли выполнить одну и ту же атомарную операцию для нескольких писем одновременно?

1 Ответ

0 голосов
/ 13 октября 2018

Используйте набор строк, если вы хотите, чтобы не было дубликатов.Если вы хотите узнать, существовали ли они в наборе до того, как вы их добавили, верните старый элемент.

const email = "email_new@example.com";
const params = {
    TableName: "myTable",
    Key: {
        id: "blackList"
    },
    UpdateExpression: "ADD #email :email",
    ExpressionAttributeNames: {
      "#email": "email"
    },
    ExpressionAttributeValues: {
      ":email": docClient.createSet(email)
    }
};

await docClient.update(params).promise();

Это добавит email_new@example.com к атрибуту электронной почты в виде набора строк.Если атрибут электронной почты не существует в объекте, он будет создан.

См. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.ADD для документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...