Dynamodb - Вставить проверку дублирования - PullRequest
0 голосов
/ 05 июля 2018

Я использую ConditionExpression, чтобы предотвратить вставку в таблицу, если в таблице существует PhoneId = 123. Однако, похоже, это не работает, так как я получаю дублирующиеся строки.

Примечание. PhoneId не является первичным ключом. Я создал индекс PhoneIdIndex, не уверен, как я могу использовать это для ConditionExpression.

  return new Promise(function(resolve, reject) {
    var params = {
      TableName: "Phone",
      ReturnConsumedCapacity: "TOTAL",
      ConditionExpression:"#PhoneId <> :PhoneId",
      ExpressionAttributeNames: { '#PhoneId': 'PhoneId' },
      ExpressionAttributeValues: { ":PhoneId": 123 },
      Item: phoneObject
    };

    docClient.put(params, function(err, data) {
      if (err) {
        console.error(err);
        reject(err);
      } else {
        resolve(data);
      }
    });
  });

1 Ответ

0 голосов
/ 05 июля 2018

DynamoDB не поддерживает экзистенциальные условные проверки на уровне таблицы для неключевых атрибутов.

Чтобы распаковать этот оператор, вы не можете создать условие, при котором «Динамо» должно будет запрашивать у таблицы произвольные элементы, отличные от добавляемых вами, от вашего имени.

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

Вы, очевидно, можете сделать наивную проверку, когда ваш рабочий процесс выглядит примерно так:

1) запрос GSI, который вы создали на PhoneId, чтобы убедиться, что он возвращает пустой результат для PhoneId, который вы пытаетесь добавить 2) добавить элемент, только если результат пуст

Но вышеприведенное восприимчиво к условиям гонки, когда другая операция может изменить таблицу между № 1 и № 2 выше, поэтому вам придется проявить творческий подход: например, вы можете сделать что-то вроде этого:

1) всегда вставлять элемент, но хранить атрибут, который записывает время, когда вы сделали вставку 2) выполнить запрос после вставки на PhoneId и отметить все старые элементы для удаления 3) удалить устаревшие записи

Решение все еще далеко от идеала, потому что оно требует от вас защиты кода для защиты от возможных временных дубликатов.

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