У меня есть таблица Dynamodb с атрибутами: userId, propertyInfo и propertyId. userId - это первичный индекс. Когда я использую следующий лямбда-код для обновления (PUT) элемента в таблице, я получаю «Предоставленный ключевой элемент не соответствует схеме».
const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports.update = (event, context, callback) => {
const timestamp = new Date().getTime();
const data = JSON.parse(event.body);
const params = {
TableName: process.env.DYNAMODB_TABLE,
Key: {
propertyId: event.pathParameters.id,
},
ExpressionAttributeNames: {
'#new_propertyInfo': 'propertyInfo',
},
ExpressionAttributeValues: {
':propertyInfo': data.propertyInfo,
},
UpdateExpression: 'SET #new_propertyInfo = :propertyInfo',
ReturnValues: 'ALL_NEW',
};
dynamoDb.update(params, (error, result) => {
// handle potential errors
if (error) {
console.error(error);
callback(null, {
statusCode: error.statusCode || 501,
headers: { 'Content-Type': 'text/plain' },
body: 'Couldn\'t fetch the item.',
});
return;
}
// create a response
const response = {
statusCode: 200,
body: JSON.stringify(result.Attributes),
};
callback(null, response);
});
};Тело моего запроса на обновление:
{
"propertyInfo":
{
"houseNumber": 2000,
"street": "easy st"
}
}Event.pathParameters.id получается из / property / {id}. Мне нужен этот идентификатор для поиска propertyId БД. UserId необходим для авторизации. Поиск и обновление Мне нужно выполнить поиск по propertyId. Может ли кто-нибудь помочь мне объяснить, что мне нужно сделать, чтобы правильно настроить это, пожалуйста?
Похоже, вам нужно переосмыслить схему таблицы. Возможно, propertyId должен быть первичным ключом, а userId - ключом сортировки, или, возможно, userId - глобальным вторичным индексом.
спасибо, ребята, за ваш вклад! Я думаю, мне нужно иметь propertyId как GSI. Есть мысли о том, как написать запрос с использованием GSI, а не хеш-ключа?
Вы не можете этого сделать. Вам нужно будет запросить таблицу, используя свой GSI, чтобы получить соответствующий первичный ключ для строки, которую вы хотите обновить. Затем выполните еще одно обновление, используя первичный ключ в качестве идентификатора.





Если ключ раздела в вашей таблице - userId, вам нужно будет установить userId в качестве ключа в ваших параметрах, а не propertyId. Если все, что у вас есть, это propertyId, вам может потребоваться найти нужную запись, а затем вызвать update с ключом userId.