是否可以使用AWS DynamoDB在GSI上使用条件表达式批量写入?

时间:2016-09-27 13:53:12

标签: amazon-web-services amazon-dynamodb

使用全局二级索引的值作为条件表达式时,是否可以批量写入DynamoDB(使用带有文档API的Java SDK v1.11.1)?

例如,我想发布一个批量更新请求,它会更新GSI library(chron) library(dplyr) library(lubridate) month <- months(dates[chron::is.weekend(dates)]) day <- dates[chron::is.weekend(dates)] # create data.frame df <- data.frame(date = day, month = month, year = chron::years(day)) df %>% group_by(year, month) %>% summarize(weekends = floor(n()/2)) # year month weekends # <dbl> <fctr> <dbl> #1 2001 April 4 #2 2001 August 4 #3 2001 Dezember 5 #4 2001 Februar 4 #5 2001 Januar 4 #6 2001 Juli 4 #7 2001 Juni 4 #8 2001 Mai 4 #9 2001 März 4 #10 2001 November 4 ## ... with 110 more rows 等于某个值的任何项目的属性A,B和C.

这是可能的,还是我必须对GSI进行查询并使用生成的主键进行批量写入?

2 个答案:

答案 0 :(得分:3)

少数事情:

  • 查询必须针对表/索引的主键(因此不能加入GSI)
  • 据我所知,您无法将ConditionalExpressions添加到batchWriteItem。
  • batchWriteItem无法更新。 (see first note here

我做这样的事情:

// Get keys from GSI
dynamodb.query({
  IndexName: 'index',
  TableName: 'table',
  KeyConditionExpression: 'some expression',
}, (error, rows) =>
// Spin up a bunch of update requests
Promise.all(rows.Items.map((row) => dynamodb.update({
  ExpressionAttributeValues: {
    ':aVal': 'new value for a',
    ':bVal': 'etc',
    ':cVal': 'etc',
  },
  IndexName: 'index',
  Key: {
    primaryKey: row.primaryKey,
  },
  KeyConditionExpression: 'primaryKey = :primKey',
  UpdateExpression: 'set a = :aVal, b = :bVal, c = :cVal',
}).promise())));

答案 1 :(得分:0)

BatchWriteItem 的行为方式与单独的 PutItemDeleteItem 调用不同。例如,您不能为单个放置和删除请求指定条件

see docs