我有一个名为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"的所有用户。
我建议您在创建gsi之前先阅读一些gsi。它们非常有用,但也很棘手。GSI在技术上是数据的物理副本,因此您需要决定要投影哪些列(在使用索引时可以读取哪些列)。此外,gsi是异步更新的,因此它们最终是一致的。它们也有自己预置的读/写吞吐量,理论上可以根据您的访问模式影响您在表上可以实现的最大吞吐量。