Java 子数组上的JSON搜索
我如何在dynamoDb中构造一个查询来搜索某个“单词”在某个值范围内的所有记录。 对于上面的示例记录,它将匹配下面的任何记录,并返回整个匹配记录Java 子数组上的JSON搜索,java,json,amazon-dynamodb,Java,Json,Amazon Dynamodb,我如何在dynamoDb中构造一个查询来搜索某个“单词”在某个值范围内的所有记录。 对于上面的示例记录,它将匹配下面的任何记录,并返回整个匹配记录 { "name": "testcase #1", "words": [ "the", "quick", "brown", "fox", "jump", "over", "the", "lazy", "dog" ], "values": [ 1, 1
{
"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
]
}
我四处搜索,但找不到关于如何在不扫描整个表的情况下执行此操作的清晰文档,这可能会对性能和成本产生重大影响。事实上,根据帖子中提供的上述结构,形成过滤器表达式是不可行的 数据模型的拟议变更:- 将
words
属性存储为map
DynamoDB数据类型
示例:-
查询:-
请注意,如果您想使用DynamoDB查询API,则必须具有哈希键数据。如果没有哈希键数据,则需要使用扫描API或需要GSI(全局二级索引)
按字数计数筛选数据的查询表达式示例:-
请注意,我在KeyConditionExpression
中使用了散列键值“testcase 1”,并在FilterExpression
中使用了其他属性
如果没有哈希键,则需要使用扫描API
"the", "quick", "second", "dog"
var table=“testcase”;
变量参数={
TableName:table,
KeyConditionExpression:“#name=:hkey”,
过滤器表达式:'words.the<:wordval1和words.the=:wordval2和words.brown>:wordval3',
表达式属性名称:{
“#name”:“name”
},
表达式属性值:{
“:hkey”:“测试用例1”,
“:wordval1”:2,
“:wordval2”:1,
“:wordval3”:3
}
};
查询(参数,函数(错误,数据){
如果(错误){
console.error(“无法读取项。错误JSON:”,JSON.stringify(err,
空,2);
}否则{
log(“GetItem successed:”,JSON.stringify(data,null,2));
}
});
您尝试了什么?实际上不太多,我不知道从哪里开始…谢谢,我会研究您的解决方案。实际的整个结构要复杂得多,但这将给我一个很好的起点。一旦我看了它,我可能会带着更多的问题回来。实际上,这可能不起作用,因为在上面的例子中,“the”这个词应该与可能不同的相关数值重复。在整个结构中,我还有更多与每个单词相关的信息,这些信息没有显示在这里,而是存在于大结构中。
"the", "quick", "second", "dog"
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));
}
});