#javascript #amazon-web-services #amazon-dynamodb
#javascript #amazon-веб-сервисы #amazon-dynamodb
Вопрос:
Я хочу отфильтровать пользователя по идентификатору электронной почты и получить последнюю запись строки, т. е. получить последние данные пользователя на основе идентификатора электронной почты, который будет отображаться. В моем случае subscriptionID — это ключ раздела. Нет вторичного индекса или ключа сортировки. Есть ли способ сделать это? или любой другой подход, на который я должен пойти?
Мой запрос Dynamo :-
var docClient = new AWS.DynamoDB.DocumentClient({ region: AWS.config.region });
var params = {
TableName: 'License',
FilterExpression: "customerEmail = :email",
ExpressionAttributeValues: {
':email': email
},
};
docClient.scan(params, function(err, data) {
if (err)
{
console.log(err);
}
else
{
console.log('length ',data.Items.length);
console.log(data.Items);
}
});
Комментарии:
1. Если я понимаю ваш вопрос, вы хотите иметь возможность запрашивать самый новый элемент, связанный с данным адресом электронной почты. Вы можете добавить GSI с ключом раздела = адресом электронной почты и ключом сортировки = отметкой времени, затем выполнить запрос для ключа раздела = адреса электронной почты с помощью ScanIndexForward = false и Limit = 1, чтобы получить самую новую.
2. Большое спасибо за вашу помощь.
Ответ №1:
scan
это самый дорогой способ получения данных из DynamoDB, и его следует избегать в большинстве случаев.
В настоящее время вы используете subscriptionID в качестве ключа раздела, что не помогает вам получать элемент по электронной почте клиента. Наиболее эффективный способ сделать это — иметь первичный ключ с электронной почтой пользователя в качестве ключа раздела и временную метку (дату покупки) в качестве ключа сортировки. Если вы сохраняете свои данные таким образом, вы можете сделать следующее:
query(
TableName= 'License',
KeyConditionExpression= '#pk = :pk',
ExpressionAttributeNames={
'#pk': 'subscriptionID'
},
ExpressionAttributeValues={
':pk': { 'S': 'apandey@projitechinc.com' }
},
ScanIndexForward=False,
Limit=1
)
Несколько моментов, на которые следует обратить внимание при выполнении этой операции:
- Это
query
операция, которая намного эффективнее, чемscan
операция. ScanIndexForward=False
Сортировка будет осуществляться с использованием ключа сортировки в порядке убывания (для возрастающего порядка установлено значение true или опускается).Limit=1
дает вам лучший результат (например, последнюю запись)
Конечно, ваши данные в настоящее время не хранятся таким образом, чтобы поддерживать этот запрос. Для этого у вас есть два варианта:
- Измените способ хранения данных, чтобы поддерживать этот шаблон доступа. Это может быть невозможно, если это приведет к нарушению других шаблонов доступа.
- Введите вторичный индекс, который использует адрес электронной почты пользователя в качестве ключа раздела и дату покупки в качестве ключа сортировки.
Чтобы получить максимальную отдачу от DynamoDB, вы должны разработать свои таблицы и способы хранения данных для поддержки шаблонов доступа к вашим приложениям. Как вы можете видеть, ваш текущий дизайн не поддерживает желаемый шаблон доступа. Существует множество способов создания таблицы для поддержки этого типа запросов, но этот шаблон распространен во многих приложениях.
Комментарии:
1. Большое спасибо. Ценю вашу помощь и время
2. Рад, что смог помочь. Удачи!