nodejs Сканирование DynamoDB по сопоставленным элементам - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть таблица DynamoDB, в которую я хотел бы вернуть все элементы, чье сопоставленное значение Review.ID равно 123.

Item: {
  id: 1,
  review: {
    Id: 123,
    step1: 456,
    step2: 789,
    step3: 1234,
    },
  // Add more items here
},
Item: {
  id: 2,
  review: {
    Id: 123,
    step1: 999,
    step2: 888,
    step3: 777,
    },
  // Add more items here
},

Пример идеального возврата:

id: 1,
review: {
 - id: 123,
 - step: 456,
 - step2: 789,
 - step3: 1234,
}
id: 2,
review: {
  - id: 123,
 - step: 999,
 - step2: 888,
 - step3: 777,
}

Это мой текущий код в NodeJS

exports.handler = async (event, context, callback) => {

 const params = {
    FilterExpression: "review.Id = :review",
    ExpressionAttributeValues: {
        ":review": 123,
    },
  TableName: "sometable"
 };


   let promise = dynamoDb.scan(params).promise();
   let result = await promise;
   let data = result.Items;
    if (result.LastEvaluatedKey) {
        params.ExclusiveStartKey = result.LastEvaluatedKey;
        data = data.concat(await (params));
    }


    // create a response
      const response = {
      statusCode: 200,
      body: JSON.stringify(data),
    };
    callback(null, response);

};

При запуске этого кода я получаю пустой результат [].

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

1 голос
/ 01 мая 2020

Вы не показали весь свой код, но я собираюсь предположить, что проблема в том, что ваш dynamoDb клиент - это низкоуровневый DynamoDB Client , а не высокоуровневый документ Клиент . Они используют разные способы предоставления значений атрибутов. Вы используете низкоуровневый клиент DynamoDB, но указываете значения атрибутов, как если бы вы использовали высокоуровневый клиент документов.

Вот пример, который противопоставляет два подхода клиента:

const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });

// High-level Document Client
const dc = new AWS.DynamoDB.DocumentClient();

// High-level scan parameters for Document Client
const paramsDC = {
  FilterExpression: "review.Id = :review",
  ExpressionAttributeValues: {
    ":review": 123,
  },
  TableName: "sometable"
};

// Low-level DynamoDB Client
const db = new AWS.DynamoDB();

// Low-level scan parameters for DynamoDB Client
const paramsDB = {
  FilterExpression: "review.Id = :review",
  ExpressionAttributeValues: {
    ":review": { "N": "123" },
  },
  TableName: "sometable"
};

(async() => {
  // High-level scan
  const resultDC = await dc.scan(paramsDC).promise();
  console.log('DC Items:', JSON.stringify(resultDC.Items));

  // Low-level scan
  const resultDB = await db.scan(paramsDB).promise();
  console.log('DB Items:', JSON.stringify(resultDB.Items));
})();

Это приводит к:

DC Items: [{"review":{"step":999,"id":123},"id":2},{"review":{"step":456,"id":123},"id":1}]
DB Items: [{"review":{"M":{"step":{"N":"999"},"id":{"N":"123"}}},"id":{"N":"2"}},{"review":{"M":{"step":{"N":"456"},"id":{"N":"123"}}},"id":{"N":"1"}}]

Обратите внимание, что низкоуровневый ответ клиента DynamoDB выглядит немного иначе, но на самом деле это просто другое (не маршалируемое) представление тех же результатов. Он включает в себя "id":{"N":"1"}, который говорит, что id - это число со значением 1, где клиент документа показывает "id":1. Низкоуровневые результаты включают в себя "M": { ... }, которые являются картами, в то время как высокоуровневый Document Client автоматически разбирает их на JavaScript объектов.

Итог:

  • Клиент документов более новый
  • Клиент документов маршаллизирует и демарширует данные в / из JavaScript собственных объектов
  • , используя Клиент документов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...