使用两个匹配字段查询 DynamoDB

Query DynamoDB with Two Matching Fileds

我是 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();
}

Issue: Invalid KeyConditionExpression: An expression attribute name used in the document path is not defined; attribute name: #otp

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

  1. 分区键
  2. 排序键

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

示例 - 分区键 - phone 排序键 - otp.

如果您已经将其他属性作为键,但无法将 otp/phone 作为键,那么您可以创建二级索引并将 phone 和 otp 标记为键。

您可以将不同的属性(列)标记为分区键或排序键,而不是已经提到的基table(主table)中的主键或排序键。

你也可以使用 --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

显示您的错误

Issue: Invalid KeyConditionExpression: An expression attribute name used in the document path is not defined; attribute name: #otp

就是在KeyConditionExpression里面加上#otp = :otp,KeyConditionExpression里面应该没有。 otp = :otp 在 KeyConditionExpression 中做类似的事情。

更新答案:

如前所述,“KeyConditionExpression”中包含的属性应该只是您的散列键,与您的基本 table 模式匹配(在本例中可能 'phone')。如果您想同时查询 'phone' 和 'otp',您需要使用哈希和范围键创建 table 并将 'otp' 指定为您的范围键。

全局二级索引完全独立于基础table,所以这种情况下可以单独查询索引(查询OtpIndex时在关键条件中使用'otp')。

示例代码:

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

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