批量获取数据或按范围查询 DynamoDB - 按范围查询

3

我有一个名为User的表格。它有一个哈希键为用户ID,一个范围键为组织ID。

如何返回所有组织ID为“3”的用户?

(顺便说一下,这是一个Lambda函数)

这段代码给了我一个错误:

console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
dynamodb.listTables(function(err, data) {
});

var params = {
    "TableName": "PoliceUser",
     "Key":
        {"User Id"   : {"S":event.objectId}, "Organization Id" : {"S": event.organizationId}
    },
   "ProjectionExpression": "#firstName, #lastName, #longitude, #latitude, #organizationName",
   "ExpressionAttributeNames" : {"#firstName": "First Name", "#lastName": "Last Name", "#longitude": "Longitude", "#latitude": "Latitude", "#organizationName": "Organization"},
   "ConsistentRead"    : true
  }

   dynamodb.BatchGetItem(params, function(err, data)
{
    if (err) {
        context.fail('error','Error updating item: '+err);
        console.log(err);
    }
  else  
  {
      //  console.log('great success: '+JSON.stringify(data, null, '  '));
       console.log(data);   
        context.succeed( data);
    }

    // successful response


});
};
1个回答

9

DynamoDB提供了几种查询项目的方式(假设您的表有散列键和范围键):

  • 通过散列键+范围键获取单个项目
  • 查询特定散列键下的所有项目
  • 扫描整个表

如果您的散列键为“用户ID”,并且您的范围键为“组织ID”,则只能查询与单个用户相关联的所有组织。

听起来您需要相反的情况,即属于一个组织的所有用户。


一种选择是交换您的散列键和范围键。在这样做之前,请确保这确实适用于您的用例。


另一种选择是向您的表添加全局二级索引(GSI),其中散列键为“组织ID”,范围键为“用户ID”,同时保留现有的散列/范围键。然后,您将能够使用此索引返回具有组织ID为“3”的所有用户。

我建议您在创建GSI之前先进行阅读。它们非常有用,但也很棘手。 GSI实际上是数据的物理副本,因此您需要决定要投影哪些列(使用索引时可以读取哪些列)。 此外,GSI是异步更新的,因此它们具有最终一致性。 它们还有自己的配置读/写吞吐量,并根据访问模式理论上可能影响您在表上可以实现的最大吞吐量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接