AWS Dynamodb Query - получить элементы из таблицы с условием - PullRequest
0 голосов
/ 03 июля 2019

Есть таблица Динамо с полями:

  • электронная почта (основной)
  • арендатор
  • другие вещи

Я хочуполучить все элементы, в которых электронная почта содержит «mike»

На моем сервере nodejs у меня есть этот код

 const TableName= 'UserTable';
 const db = new aws.DynamoDB();
 const email = 'mike.green@abc.com'

    params = {
      TableName: userTableName,
      KeyConditionExpression: '#email = :email',
      ExpressionAttributeNames: {
        '#email': 'email',
      },
      ExpressionAttributeValues: {
        ':email': { S: email },
      },
    };

  db.query(params, (err, data) => {
    if (err) {
      reject(err);
    } else {
      const processedItems = [...data.Items].sort((a, b) => a.email < b.email ? -1 : 1);
      const processedData = { ...data, Items: processedItems };
      resolve(processedData);
    }

, это работает ^^ только если я ищу всю электронную почту mike.green@ abc.com

Вопрос 1 - Но, если я хочу найти mike и вернуть все элементы, в которых электронное письмо содержит mike , Как я могу получить это?

Вопрос 2 Если я хочу получить все строки, в которых электронная почта содержит mike и арендатор - Canada ,Как я могу получить это?

1 Ответ

1 голос
/ 04 июля 2019

Я не пользователь NodeJS, но надеюсь, что это будет полезно.

Вопрос 1 - Но если я хочу найти Майка и вернуть все предметы, где электронная почта содержит Майк, как я могу получить это?

Ключевые выражения зарезервированы для ограничений равенства. Если вы хотите повысить гибкость запросов, вам нужно использовать выражение фильтра. Обратите внимание, что вы не сможете использовать выражение фильтра для ключа раздела. Вы можете найти больше информации о https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html, но самое главное:

Ключевое выражение состояния

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

Вы должны указать имя и значение ключа раздела как равенство состояние.

Вы можете дополнительно указать второе условие для ключа сортировки (если подарок). Условие ключа сортировки должно использовать одно из следующих операторы сравнения:

a = b — true if the attribute a is equal to the value b

a < b — true if a is less than b

a <= b — true if a is less than or equal to b

a > b — true if a is greater than b

a >= b — true if a is greater than or equal to b

a BETWEEN b AND c — true if a is greater than or equal to b, and less than or equal to c.

Также поддерживается следующая функция:

begins_with (a, substr)— true if the value of attribute a begins with a particular substring.

......

Вопрос 2 Если я хочу получить все строки, где электронная почта содержит Майк и Арендатором является Канада. Как я могу получить это?

Вы можете использовать выражение фильтра для этого и использовать одну из доступных функций https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Syntax. Выражение фильтра:

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

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

Операция Query может извлечь максимум 1 МБ данных. Этот предел применяется до оценки выражения фильтра.

Выражение фильтра не может содержать ключ раздела или ключ сортировки атрибутов. Вы должны указать эти атрибуты в условии ключа выражение, а не выражение фильтра. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html

Подводя итог:

  • , если электронная почта является вашим ключом раздела, вы не можете применить contains к нему - вы должны запросить его напрямую.
  • в конечном итоге вы можете выполнить сканирование своей таблицы и применить к ней фильтр (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html), но я бы не стал этого делать из-за потребляемой емкости таблицы и времени отклика. Сканирование включает работу со всеми строками в таблица, так что если у вас есть несколько сотен ГБ, вы, скорее всего, не получите информацию в режиме реального времени, а обслуживание в режиме реального времени является одной из целей DynamoDB.
...