{
"name": "testcase #1",
"words": [
"the",
"quick",
"brown",
"fox",
"jump",
"over",
"the",
"lazy",
"dog"
],
"values": [
1,
1,
4,
4,
1,
6,
1,
3,
5
]
},
{
"name": "testcase #2",
"words": [
"the",
"second",
"test",
"about",
"jump",
"over",
"the",
"lazy",
"dog"
],
"values": [
3,
2,
4,
5,
3,
6,
4,
3,
1
]
}
如何在dynamoDb中制定查询以搜索某些“单词”所具有的所有记录在某些值的范围内。 对于上面的示例记录,它将匹配以下任何一个并返回整个匹配记录。
"the" < 2
"the" = 1
"brown" > 3
我还可以要求返回值小于3的所有“单词”;
"the", "quick", "second", "dog"
我一直在搜索,但无法找到有关如何执行此操作的明确文档,而无需扫描整个表格,这可能会对性能和成本产生重大影响。
答案 0 :(得分:1)
实际上,通过帖子中提供的上述结构,形成过滤表达式不可行。
建议更改数据模型: -
将words
属性存储为map
DynamoDB数据类型。
示例: - 强>
<强>查询: - 强>
请注意,如果您要使用DynamoDB 查询API ,则必须拥有HASH密钥数据。如果您没有哈希密钥数据,则需要使用扫描API 或需要 GSI (全球二级索引)。
按字数过滤数据的示例查询表达式: -
请注意,我使用了哈希键值&#39; testcase 1&#39;在KeyConditionExpression
和FilterExpression
上的其他属性。
如果您没有哈希密钥,则需要使用Scan API。
var table = "testcase";
var params = {
TableName : table,
KeyConditionExpression : '#name = :hkey',
FilterExpression: 'words.the < :wordval1 and words.the = :wordval2 and words.brown > :wordval3',
ExpressionAttributeNames : {
'#name' : 'name'
},
ExpressionAttributeValues : {
':hkey' : 'testcase 1',
':wordval1' : 2,
':wordval2' : 1,
':wordval3' : 3
}
};
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
}
});