【发布时间】:2021-06-18 14:32:51
【问题描述】:
我有一个名为“frank”的 DynamoDB 表,其中包含一个 GSI。分区键称为 PK,排序键称为 SK,GSI 分区键称为 GSI1_PK,GSI 排序键称为 GSI1_SK。我有一个存储实际数据的“数据”地图。
GSI 分区键和排序键直接映射到表中同名的属性。
我可以运行 partiql 查询来获取图像中显示的结果。这是partiql代码:
select PK, SK, GSI1_PK, GSI1_SK, data from "frank"."GSI1"
where
("GSI1_PK"='tesla')
and
(
( "GSI1_SK" >= 'A_VISITOR#2021-06-01-00-00-00-000' and "GSI1_SK" <= 'A_VISITOR#2021-06-20-23-59-59-999' )
or
( "GSI1_SK" >= 'B_INTERACTION#2021-06-01-00-00-00-000' and "GSI1_SK" <= 'B_INTERACTION#2021-06-20-23-59-59-999' )
)
注意 partiql 代码如何多次引用“GSI1_SK”。 partiql 查询有效,并返回图像中显示的数据。到目前为止一切都很好。
但是,我现在想将其移至 Lambda 函数中。如何构建 AWS.DynamoDB.DocumentClient 查询以完全执行此 partiql 查询正在执行的操作?
我可以让它在我的 Lambda 函数中工作:
const visitorStart="A_VISITOR#2021-06-01-00-00-00-000";
const visitorEnd="A_VISITOR#2021-06-20-23-59-59-999";
var params = {
TableName: "frank",
IndexName: "GSI1",
KeyConditionExpression: "#GSI1_PK=:tmn AND #GSI1_SK BETWEEN :visitorStart AND :visitorEnd",
ExpressionAttributeNames :{ "#GSI1_PK":"GSI1_PK", "#GSI1_SK":"GSI1_SK" },
ExpressionAttributeValues: {
":tmn": lowerCaseTeamName,
":visitorStart": visitorStart,
":visitorEnd": visitorEnd
}
};
const data = await documentClient.query(params).promise();
console.log(data);
但一旦我尝试更复杂的复合条件,我就会收到此错误:
ValidationException: Invalid operator used in KeyConditionExpression: OR
这是更复杂的尝试:
const visitorStart="A_VISITOR#2021-06-01-00-00-00-000";
const visitorEnd="A_VISITOR#2021-06-20-23-59-59-999";
const interactionStart="B_INTERACTION#2021-06-01-00-00-00-000";
const interactionEnd="B_INTERACTION#2021-06-20-23-59-59-999";
var params = {
TableName: "frank",
IndexName: "GSI1",
KeyConditionExpression: "#GSI1_PK=:tmn AND (#GSI1_SK BETWEEN :visitorStart AND :visitorEnd OR #GSI1_SK BETWEEN :interactionStart AND :interactionEnd) ",
ExpressionAttributeNames :{ "#GSI1_PK":"GSI1_PK", "#GSI1_SK":"GSI1_SK" },
ExpressionAttributeValues: {
":tmn": lowerCaseTeamName,
":visitorStart": visitorStart,
":visitorEnd": visitorEnd,
":interactionStart": interactionStart,
":interactionEnd": interactionEnd
}
};
const data = await documentClient.query(params).promise();
console.log(data);
文档说 KeyConditionExpressions 不支持“或”。那么,如何使用 AWS.DynamoDB.DocumentClient 在 Lambda 中复制更复杂的 partiql 查询?
【问题讨论】:
标签: amazon-web-services aws-lambda amazon-dynamodb