dynamoDB - 通过主键数组从DB获取多个项目

gol*_*cks 6 amazon-dynamodb aws-sdk

我有一个用户ID的数组,我想从dynamoDB表中获取具有该id的所有用户

没有在文档中找到它

有任何想法吗?

gol*_*cks 10

我最终使用了 batchGet,这是AWS.DynamoDB.DocumentClient 的一个操作

不支持具有相同键的多个项目,因此我必须像这样一遍又一遍地定义键:

var dynamoConfig = {
  sessionToken:    process.env.AWS_SESSION_TOKEN,
  region:          process.env.AWS_REGION
};
var dynamodbDocClient = new AWS.DynamoDB.DocumentClient(dynamoConfig);

var params = {
  RequestItems: {
    tableName: {
      Keys: [
        {
          id: 'user1Id'
        },
        {
          id: 'user2Id'
        },
        {
          id: 'user3Id'
        }
      ]
    }
  }
}

dynamodbDocClient.batchGet(paramsForQueringFormerEvaluators, function(err, data) {
  if (err) {
    console.log('createEvaluation: get former evaluators: err: ', err);
    return;
  }

  var users = data.Responses.tableName;
  console.log('createEvaluation: get former evaluators: ', users);

});
Run Code Online (Sandbox Code Playgroud)

  • 您的情况下 paramsForQueringFormerEvaluators 是什么?参数? (2认同)

vis*_*ell 6

您可能可以使用Scan方法。

我目前正在使用 pythonboto3包。参考scanboto3。所以代码会是这样的:

table = boto3.resourse('dynamodb').Table('users-table-name')
response = table.scan(
    ScanFilter={'user-id': {
        'AttributeValueList': user_ids,
        'ComparisonOperator': 'IN' }
    }
)
Run Code Online (Sandbox Code Playgroud)

但我不确定使用BatchGetItemor哪个更好Scan。大概取决于两个因素:

  1. 表中有多少条记录 ( table.item_count)
  2. 您需要获得多少物品 ( count(user_ids))

如果count(user_ids) << table.item_count那么你肯定需要使用BatchGetItem.

如果count(user_ids) / table.item_count -> 1那时你需要使用Scan.

  • 如果您知道要查找的项目 ID,请避免扫描操作。它们的执行成本很高,因为必须扫描完整的数据集(可能跨分区)。 (2认同)
  • 这绝对可以摧毁你。切勿在生产环境中使用扫描,除非您有一个非常小的表 (2认同)

ket*_*iya 5

您可以为此使用 BatchGetItem API。

当然,如果不知道您的表架构,我无法帮助您处理任何代码片段。但是您可以在此处查看文档。