查询在DynamoDB中的地图列表
问题描述:
我想过滤来自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
});
答
如果你有一个带有分区键的表,你可以通过id获得单个项目的唯一方法。所以,你需要有一个表,看起来像:
电子邮件(串) - 分区键
标识(某些类型) - 用户ID
...其他相关的用户数据
不幸的是,由于嵌套字段不能成为分区键,因此您必须在此处维护一个单独的表,并且无法在DynamoDB中使用索引(无论是LSI还是GSI)。
这是NoSQL中重复数据的常见模式,所以没有什么不寻常的。如果您使用的是Java,则可以使用transactions library,以确保两个表同步。
如果您不打算使用Java,您可以读取原始数据库(电子邮件是嵌套字段)的DynamoDB stream,并在更新原始表时更新新表(电子邮件是分区键)。