Не удается проверить вложенные атрибуты карты DynamoDB - PullRequest
0 голосов
/ 24 марта 2020

Я новичок в DynamoDB и пытаюсь запросить таблицу из javascript, используя библиотеку Dynamoose . У меня есть таблица с первичным ключом раздела типа String с именем «id», которая в основном представляет собой длинную строку с идентификатором пользователя. У меня есть второй столбец в таблице под названием «атрибуты», который представляет собой карту DynamoDB и используется для хранения произвольных пользовательских атрибутов (я не могу изменить схему, поскольку именно так работает предопределенный адаптер персистентности, и я застрял в работе с ним для удобства). Это пример записи в таблице:

Item{2}
  attributes Map{2}
      10 Number:    2
      11 Number:    4
      12 Number:    6
      13 Number:    8
  id String: YVVVNIL5CB5WXITFTV3JFUBO2IP2C33BY

Поля цифры c, такие как поле «12», на карте можно интерпретировать как «week10», «week11», «week12» и «week13» и значения цифр c 2,4,6 и 8 - это число раз, которое приложение было запущено на этой неделе.

Мне нужно получить все идентификаторы пользователей из записи, которые имеют более 4 запусков в определенную c неделю (например, неделю 12), и мне также нужно получить список идентификаторов пользователей с суммой в 20 запусков в диапазоне от четырех недель (например, с недели 10 до 13).

С Dynamoose мне нужно использовать следующую модель:

dynamoose.model(
    DYNAMO_DB_TABLE_NAME, 
    {id: String, attributes: Map},
    {useDocumentTypes: true, saveUnknown: true}
);

(чтобы соответствовать структуре таблицы, сгенерированной адаптером персистентности, который я использую). Я предполагаю, что мне нужно будет выполнить «сканирование» DynamoDB, а не «запрос», и я попытался это начать, чтобы получить записи, где неделя 12 равна 6 безрезультатно (в результате я получаю пустой набор):

const filter = {
        FilterExpression: 'contains(#attributes, :val)',
        ExpressionAttributeNames: {
          '#attributes': 'attributes',
        },
        ExpressionAttributeValues: {
          ':val': {'12': 6},
        },
      };

    model.scan(filter).all().exec(function (err, result, lastKey) {
        console.log('query result: '+ JSON.stringify(result));
    });

Если вы не знаете Dynamoose, но можете помочь решить эту проблему с помощью AWS SDK, запустите сканирование DynamoDB напрямую, что также может быть полезно для меня.

Спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Попробуйте следующее.

const filter = {
    FilterExpression: '#attributes.#12 = :val',
    ExpressionAttributeNames: {
        '#attributes': 'attributes',
        '#12': '12'
    },
    ExpressionAttributeValues: {
        ':val': 6,
    },
};

Похоже, что вы действительно пытаетесь сделать, это фильтровать элементы, где attributes.12 = 6. Именно это и сделает запрос, приведенный выше.

Содержит нельзя использовать для объектов или массивов.

...