Динамо DB Query Filter Node.js - PullRequest
0 голосов
/ 13 января 2020

Запуск Node.js серверного бэкэнда через AWS.

Основная цель: отфильтровать и перечислить все ЛОКАЛЬНЫЕ задания (элементы таблицы), которые включали доступные службы и почтовые индексы, предоставленные фильтру.

Я передаю несколько почтовых индексов коды и несколько доступных служб.

data.radius будет массивом почтовых индексов = примерно так: [ '93901', '93902', '93905', '93906', '93907', '93912', '93933', '93942', '93944', '93950', '95377', '95378', '95385', '95387', '95391' ]

data.availableServices также будет массивом = что-то вроде this ['Snow removal', 'Ice Removal', 'Salting', 'Same Day Response']

Я пытаюсь выполнить вызов API, который возвращает только элементы, которые соответствуют zipCode из массива почтовых индексов, предоставленных data.radius, а packageSelected имеет совпадение предоставляется массив data.availableServices.

API CALL

import * as dynamoDbLib from "./libs/dynamodb-lib";
import { success, failure } from "./libs/response-lib";

export async function main(event, context) {
  const data = JSON.parse(event.body);
  const params = {
    TableName: "jobs",
    FilterExpression: "zipCode = :radius, packageSelected = :availableServices",
    ExpressionAttributeValues: {
      ":radius": data.radius,
      ":availableServices": data.availableServices
    }
  };

  try {
    const result = await dynamoDbLib.call("query", params);
    // Return the matching list of items in response body
    return success(result.Items);
  } catch (e) {
    return failure({ status: false });
  }

Нужно ли сначала сопоставить массив почтовых индексов и доступных служб чтобы это работало?

Должен ли я использовать операторы сравнения? https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html

Требуется ли значение ключа сортировки или ключ раздела для запроса и фильтрации? (в таблице есть ключ сортировки и ключ раздела, но я бы не хотел использовать их в этом вызове)

Я не уверен на 100% в том, как go узнать об этом, так что если кто-нибудь сможет указать мне правую направление, которое было бы замечательно и высоко ценится!

1 Ответ

1 голос
/ 13 января 2020

Я не уверен, к чему относится ваш dynamodb-lib, но вот пример того, как вы можете сканировать attribute1 в данном наборе значений и attribute2 в другом наборе значений. При этом используется стандартный AWS JavaScript SDK и, в частности, высокоуровневый клиент документов.

Обратите внимание, что здесь нельзя использовать тест на равенство (==), необходимо использовать включение (IN) тест. И вы не можете использовать query, но должны использовать scan.

const AWS = require('aws-sdk');

let dc = new AWS.DynamoDB.DocumentClient({'region': 'us-east-1'});

const data = {
  radius: [ '93901', '93902', '93905', '93906', '93907', '93912', '93933', '93942', '93944', '93950', '95377', '95378', '95385', '95387', '95391' ],
  availableServices: ['Snow removal', 'Ice Removal', 'Salting', 'Same Day Response'],
};

// These hold ExpressionAttributeValues
const zipcodes = {};
const services = {};

data.radius.forEach((zipcode, i) => {
  zipcodes[`:zipcode${i}`] = zipcode;
})

data.availableServices.forEach((service, i) => {
  services[`:services${i}`] = service;
})

// These hold FilterExpression attribute aliases
const zipcodex = Object.keys(zipcodes).toString();
const servicex = Object.keys(services).toString();

const params = {
  TableName: "jobs",
  FilterExpression: `zipCode IN (${zipcodex}) AND packageSelected IN (${servicex})`,
  ExpressionAttributeValues : {...zipcodes, ...services},
};

dc.scan(params, (err, data) => {
  if (err) {
    console.log('Error', err);
  } else {
    for (const item of data.Items) {
      console.log('item:', item);
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...