2017-07-27 66 views
1

我想過濾來自dynamodb表的以下格式的地圖列表。查詢在DynamoDB中的地圖列表

{ 
    id: "Number", 
    users: { 
     { userEmail: [email protected], age:"23" }, 
     { userEmail: [email protected], age:"41" } 
    } 
} 

我需要將userEmail的用戶數據作爲「[email protected]」。目前我正在使用下面的dynamodb查詢。有沒有其他有效的方法來解決這個問題?

var params = { 
     TableName: 'users', 
     Key:{ 
      'id': id 
     } 
    }; 
    var docClient = new AWS.DynamoDB.DocumentClient(); 
    docClient.get(params, function (err, data) { 
    if (!err) { 
     const users = data.Item.users; 
     const user = users.filter(function (user) { 
     return user.email == userEmail; 
     }); 
     // filtered has the required user in it 
    }); 

回答

1

如果你有一個帶有分區鍵的表,你可以通過id獲得單個項目的唯一方法。所以,你需要有一個表,看起來像:

電子郵件(串) - 分區鍵

標識(某些類型) - 用戶ID

...其他相關的用戶數據

不幸的是,由於嵌套字段不能成爲分區鍵,因此您必須在此處維護一個單獨的表,並且無法在DynamoDB中使用索引(無論是LSI還是GSI)。

這是NoSQL中重複數據的常見模式,所以沒有什麼不尋常的。如果您使用的是Java,則可以使用transactions library,以確保兩個表同步。

如果您不打算使用Java,您可以讀取原始數據庫(電子郵件是嵌套字段)的DynamoDB stream,並在更新原始表時更新新表(電子郵件是分區鍵)。