JSON搜索子数组

时间:2017-02-28 19:29:35

标签: java json amazon-dynamodb

{
  "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"

我一直在搜索,但无法找到有关如何执行此操作的明确文档,而无需扫描整个表格,这可能会对性能和成本产生重大影响。

1 个答案:

答案 0 :(得分:1)

实际上,通过帖子中提供的上述结构,形成过滤表达式不可行

建议更改数据模型: -

words属性存储为map DynamoDB数据类型。

示例: -

Storing words as map

<强>查询: -

请注意,如果您要使用DynamoDB 查询API ,则必须拥有HASH密钥数据。如果您没有哈希密钥数据,则需要使用扫描API 或需要 GSI (全球二级索引)。

按字数过滤数据的示例查询表达式: -

请注意,我使用了哈希键值&#39; testcase 1&#39;在KeyConditionExpressionFilterExpression上的其他属性。

如果您没有哈希密钥,则需要使用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));
    }
});