0

我是 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

4

2 回答 2

2

如您的错误所示

问题:无效的 KeyConditionExpression:文档路径中使用的表达式属性名称未定义;属性名称:#otp

它只是意味着您在 KeyConditionExpression 中添加了#otp = :otp,它不应该在 KeyConditionExpression 中。otp = :otp 在 KeyConditionExpression 中做类似的事情。

更新答案:

如前所述,“KeyConditionExpression”中包含的属性应该只是您的哈希键,与您的基表模式匹配(在这种情况下可能是“电话”)。如果要同时查询“phone”和“otp”,则需要使用哈希和范围键创建表,并将“otp”指定为范围键。

全局二级索引与基表完全分离,因此在这种情况下您可以单独查询索引(在查询 OtpIndex 时在 key condition 中使用 'otp')。

示例代码:

var params = {
        TableName: 'users',
        IndexName: "OtpIndex",
        KeyConditionExpression: "phone = :phone and otp = :otp",
        ExpressionAttributeValues: {
            ':phone': 919600923917,
            ':otp': 2387
        },
      };

请查找有关查询全局二级索引的更多详细信息Doc

于 2020-12-23T07:54:20.233 回答
1

您可以使用两个匹配字段。为此,您需要定义 2 个键

  1. 分区键
  2. 排序键

将一个字段标记为分区键,将另一个字段标记为排序键

示例 - 分区键 - 电话排序键 - otp。

如果您已经将其他属性作为键并且无法将 otp/phone 作为键,那么您可以创建二级索引并将 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
于 2020-12-23T07:39:19.470 回答