Query List of Maps in DynamoDB

十年热恋 提交于 2021-01-28 03:04:49

问题


I am trying to filter list of maps from a dynamodb table which is of the following format.

{
   id: "Number",
   users: {
      { userEmail: abc@gmail.com, age:"23" },
      { userEmail: de@gmail.com, age:"41" }
   }
}

I need to get the data of the user with userEmail as "abc@gmail.com". Currently I am doing it using the following dynamodb query. Is there any another efficient way to solve this issue ?

 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:


The only way you can get a single item in dynamo by id if you have a table with a partition key. So you need to have a table that looks like:

Email (string) - partition key

Id (some-type) - user id

...other relevant user data

Unfortunately, since a nested field cannot be a partition key you will have to maintain a separate table here and won't be able to use an index in DynamoDB (neither LSI, nor GSI).

It's a common pattern in NoSQL to duplicate data, so there is nothing unusual in it. If you were using Java, you could use transactions library, to ensure that both tables are in sync.

If you are not going to use Java you could read DynamoDB stream of the original database (where emails are nested fields) and update the new table (where emails are partition keys) when an original table is updated.



来源:https://stackoverflow.com/questions/45340600/query-list-of-maps-in-dynamodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!