如果主键包含值,则 DynamoDB 过滤器
DynamoDB filter if primary key contains value
当前
我在 DynamoDB 中有一个 table 具有单个属性 - 主键 - 包含唯一值。
PK
------
#A#B#C#
#B#C#
#C#D#E#
#BC#
问题
我希望对 #B#C# 进行 2 次搜索 (1) 完全匹配,以及 (2) 包含匹配,因此只需要结果:
(1) Exact Match:
#B#C#
(2) Containing Match:
#A#B#C#
#B#C#
- 这 2 个搜索是否可以针对主键进行搜索?
- 如果是这样,对 运行 最有效的查询是什么?例如查询或扫描
注:
对于 (2),我正在使用以下代码,但它返回了数据库中的所有项目:
params = {
TableName: 'myTable',
FilterExpression: "contains(#key, :v)",
ExpressionAttributeNames: { "#key": "PK" },
ExpressionAttributeValues: { ":v": #B#C# }
}
dynamodb.scan(params,callback)
DynamoDB 支持两种主要类型的搜索:查询和扫描。查询操作根据主键值查找项目。通过访问 table 或二级索引
中的每个项目,扫描操作 returns 一个或多个项目和项目属性
如果您想查找具有主键 #B#C
的项目,您可以使用 query API:
ddbClient.query(
{
"TableName": "<YOUR TABLE NAME>",
"KeyConditionExpression": "#pk = :pk",
"ExpressionAttributeValues": {
":pk": {
"S": "#B#C"
}
},
"ExpressionAttributeNames": {
"#pk": "PK"
}
}
)
对于第二个访问模式,您需要使用扫描 API,因为您要搜索整个 table/secondary 索引。
您可以使用扫描来测试主键是否具有使用 contains
的子字符串。我没有发现您的扫描操作格式有任何问题。
以这种方式使用扫描时要小心。因为 scan 会读取整个 table 来获取结果,所以大规模操作的效率会相当低。如果此操作很少 运行,或者您针对稀疏索引 运行 进行操作,则可能没问题。但是,如果它是您的主要访问模式之一,您可能需要重新考虑使用扫描 API 进行此操作。
当前
我在 DynamoDB 中有一个 table 具有单个属性 - 主键 - 包含唯一值。
PK
------
#A#B#C#
#B#C#
#C#D#E#
#BC#
问题
我希望对 #B#C# 进行 2 次搜索 (1) 完全匹配,以及 (2) 包含匹配,因此只需要结果:
(1) Exact Match:
#B#C#
(2) Containing Match:
#A#B#C#
#B#C#
- 这 2 个搜索是否可以针对主键进行搜索?
- 如果是这样,对 运行 最有效的查询是什么?例如查询或扫描
注:
对于 (2),我正在使用以下代码,但它返回了数据库中的所有项目:
params = {
TableName: 'myTable',
FilterExpression: "contains(#key, :v)",
ExpressionAttributeNames: { "#key": "PK" },
ExpressionAttributeValues: { ":v": #B#C# }
}
dynamodb.scan(params,callback)
DynamoDB 支持两种主要类型的搜索:查询和扫描。查询操作根据主键值查找项目。通过访问 table 或二级索引
中的每个项目,扫描操作 returns 一个或多个项目和项目属性如果您想查找具有主键 #B#C
的项目,您可以使用 query API:
ddbClient.query(
{
"TableName": "<YOUR TABLE NAME>",
"KeyConditionExpression": "#pk = :pk",
"ExpressionAttributeValues": {
":pk": {
"S": "#B#C"
}
},
"ExpressionAttributeNames": {
"#pk": "PK"
}
}
)
对于第二个访问模式,您需要使用扫描 API,因为您要搜索整个 table/secondary 索引。
您可以使用扫描来测试主键是否具有使用 contains
的子字符串。我没有发现您的扫描操作格式有任何问题。
以这种方式使用扫描时要小心。因为 scan 会读取整个 table 来获取结果,所以大规模操作的效率会相当低。如果此操作很少 运行,或者您针对稀疏索引 运行 进行操作,则可能没问题。但是,如果它是您的主要访问模式之一,您可能需要重新考虑使用扫描 API 进行此操作。