#mongodb #amazon-web-services #mongoose #amazon-dynamodb #documentclient
#mongodb #amazon-веб-сервисы #мангуст #amazon-dynamodb #documentclient
Вопрос:
Я новичок в DynamoDB. Я пытаюсь запросить коллекцию с двумя совпадающими полями. Я написал код в MongoDB, я пытаюсь перейти на DocumentDB. Я столкнулся с проблемой.
Код MongoDB
Это работает хорошо
getUser= async(req,res)=>{
let user = await user.findOne({phone:123456789, otp:2345});
}
Код DynamoDB
getUser= async(req,res)=>{
const params = {
KeyConditionExpression: 'phone = :phone and #otp = :otp',
ExpressionAttributeValues: {
':phone': 919600923917,
":otp":2387
},
TableName: "users",
};
const user= await documentClient.query(params).promise();
}
Проблема: недопустимое выражение KeyConditionExpression: имя атрибута выражения
, используемое в пути к документу, не определено; имя атрибута: #otp
Ответ №1:
Как отображается ваша ошибка
Проблема: недопустимое выражение KeyConditionExpression: имя атрибута выражения, используемое в пути к документу, не определено; имя атрибута: #otp
Это просто означает, что вы добавляете #otp = :otp в KeyConditionExpression , его не должно быть в KeyConditionExpression. otp = :otp сделайте что-то вроде в KeyConditionExpression .
Обновленный ответ:
Как уже упоминалось, атрибут, включенный в «KeyConditionExpression», должен быть только вашим хэш-ключом, соответствующим вашей схеме базовой таблицы (в данном случае, возможно, «телефон»). Если вы хотите выполнить запрос как по «телефону», так и по «otp», вам необходимо создать таблицу с хэшем и ключом диапазона и указать «otp» в качестве вашего ключа диапазона.
Глобальные вторичные индексы полностью отделены от базовой таблицы, поэтому в этом случае вы можете запрашивать индексы отдельно (используйте «otp» в ключевом условии при запросе OtpIndex).
Пример кода:
var params = {
TableName: 'users',
IndexName: "OtpIndex",
KeyConditionExpression: "phone = :phone and otp = :otp",
ExpressionAttributeValues: {
':phone': 919600923917,
':otp': 2387
},
};
Пожалуйста, найдите более подробную информацию о запросе глобальных вторичных индексов Doc
Комментарии:
1.
Query key condition not supported
Я получаю это2. Ответ обновлен, и использование глобальных вторичных индексов является вашим идеальным решением для запроса двух совпадающих файлов.
Ответ №2:
Вы можете использовать два совпадающих поля. для этого вам необходимо определить 2 ключа
- Ключ раздела
- Ключ сортировки
Отметьте одно поле как ключ раздела, а другое как ключ сортировки
Пример — Ключ раздела — ключ сортировки телефона — otp.
если вы уже создали другой атрибут в качестве ключа и не можете использовать otp / phone в качестве ключа, вы можете создать вторичный индекс и пометить телефон и otp в качестве ключа.
вы можете пометить различные атрибуты (столбцы) в качестве ключа раздела или ключа сортировки, отличного от уже упомянутого первичного ключа или ключа сортировки в базовой таблице (главной таблице).
также вы можете использовать --filter-expression
что-то вроде этого
aws dynamodb query
--table-name users
--key-condition-expression "phone = :phone
--filter-expression "#otp = :otp"
--expression-attribute-names '{"#otp": "otp"}'
--expression-attribute-values file://values.json
Комментарии:
1. Так что это не так просто, как MongoDB: (