Amazon dynamodb BatchGetItem或查询DynamoDb-按范围查询

Amazon dynamodb BatchGetItem或查询DynamoDb-按范围查询,amazon-dynamodb,Amazon Dynamodb,我有一个名为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, contex

我有一个名为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


});
};

DynamoDB提供了几种查询项的方法(假设您的表具有哈希键和范围键):

  • 通过哈希键+范围键获取单个项
  • 查询所有项以查找特定哈希键
  • 扫描整个桌子
使用“用户Id”的散列键和“组织Id”的范围键,您只能查询单个用户关联的所有组织

听起来你想要的是相反的,属于一个组织的所有用户


一种选择是交换散列键和范围键。在您这样做之前,请确保这对您的用例来说是有意义的


或者,您可以向表中添加一个,其中散列键为“组织Id”,范围键为“用户Id”,同时保留现有散列/范围键的当前存在状态。然后,您可以使用此索引返回组织Id为“3”的所有用户

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