Запрос DynamoDB с двумя совпадающими файлами

#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 ключа

  1. Ключ раздела
  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: (