2017-07-27 76 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,并在更新原始表时更新新表(电子邮件是分区键)。