使用两个匹配字段查询 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 个键
- 分区键
- 排序键
将一个字段标记为分区键,将另一个字段标记为排序键
示例 - 分区键 - 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
我是 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 个键
- 分区键
- 排序键
将一个字段标记为分区键,将另一个字段标记为排序键
示例 - 分区键 - 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