Amazon dynamodb DynamoDB中的地图查询列表

Amazon dynamodb DynamoDB中的地图查询列表,amazon-dynamodb,nested-queries,nosql,Amazon Dynamodb,Nested Queries,Nosql,我试图从dynamodb表中筛选地图列表,该表的格式如下 { id: "Number", users: { { userEmail: abc@gmail.com, age:"23" }, { userEmail: de@gmail.com, age:"41" } } } 我需要通过userEmail获取用户的数据作为“abc@gmail.com". 目前,我正在使用下面的dynamodb查询进行此操作。有没有其他有效的方法来解决这个问题 var pa

我试图从dynamodb表中筛选地图列表,该表的格式如下

{
   id: "Number",
   users: {
      { userEmail: abc@gmail.com, age:"23" },
      { userEmail: de@gmail.com, age:"41" }
   }
}
我需要通过userEmail获取用户的数据作为“abc@gmail.com". 目前,我正在使用下面的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
  });

如果您有一个带有分区键的表,那么在dynamo中通过id获取单个项的唯一方法是。因此,您需要有一个如下所示的表:

电子邮件(字符串)-分区键

Id(某些类型)-用户Id

…其他相关用户数据

不幸的是,由于嵌套字段不能是分区键,因此您必须在这里维护一个单独的表,并且不能在DynamoDB中使用索引(既不是LSI,也不是GSI)

在NoSQL中,复制数据是一种常见的模式,因此没有什么不寻常的地方。如果您使用的是Java,那么可以使用确保两个表同步

如果不打算使用Java,则可以读取原始数据库(其中电子邮件是嵌套字段),并在更新原始表时更新新表(其中电子邮件是分区键)