2017-02-28 60 views
0
{ 
    "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中制定一個查詢來搜索特定「詞」所具有的特定值的範圍內的所有記錄。 上面的示例記錄將匹配以下任何一項,並返回整個匹配記錄。子陣列上的JSON搜索

"the" < 2 
"the" = 1 
"brown" > 3 

我也可以要求返回所有值小於3的「單詞」將返回;

"the", "quick", "second", "dog" 

伊夫搜索周圍,但無法找到如何做到這一點明確的文檔,而不必掃描可能有重大的性能和成本影響整個表。

+0

你試過了什麼? –

+0

其實並不多,我不知道從哪裏開始... –

回答

1

實際上,在帖子提供的上述結構中,不可行來形成過濾表達式。在數據模型

建議更改: -

商店words屬性作爲map DynamoDB的數據類型。

例子: -

Storing words as map

查詢: -

請注意,如果你想使用DynamoDB 查詢API,你必須有HASH的關鍵數據。如果您沒有散列密鑰數據,則需要使用掃描API或需要GSI(全球二級索引)。

實施例的查詢表達式過濾由字的數據計數: -

請注意,我已經使用了散列鍵值中KeyConditionExpression和其他屬性「測試用例1」上FilterExpression

如果您沒有散列碼,則需要使用掃描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)); 
    } 
}); 
+0

謝謝我會研究你的解決方案。實際的整體結構要複雜得多,但這會給我一個很好的起點。一旦我看到它,我可能會回來更多的問題。 –

+0

實際上,在上例中,可能不起作用,因此單詞「the」應該與可能不同的數值相關聯。在整個結構中,我也有更多的信息與每個在這裏沒有顯示但是存在於大結構中的單詞相關聯。 –