【问题标题】:AWS DynamoDB Transact Write using IN operator on ArrayAWS DynamoDB Transact Write 使用数组上的 IN 运算符
【发布时间】:2020-04-20 13:54:20
【问题描述】:

我正在处理一个查询,我需要使用 dynamoDB 的 TrasactWrite 并在我的一张表上执行更新查询。

场景是我有一组唯一 ID,我需要对数组中的每个 ID 执行相同的更新操作,并在不使用循环或映射的情况下更改表中的一个标志。

但是我很难找到与如何在作为 TransactWrite 的 Key 参数中的主键的 ID 上使用 IN 运算符相关的示例或文档。

这是我的示例代码:

let IDs = await find('table', { type: 'some_type' }, 'type-index}
let params = {
                TransactItems: [{
                    Update: {
                        TableName: 'table',
                        Key: '#_id IN :IDs,
                        UpdateExpression: 'set #flag = :flag',
                        ExpressionAttributeNames: {
                            '#flag': 'flag',
                            '#_id': '_id'
                        },
                        ExpressionAttributeValues: {
                            ':flag': false,
                            ":IDs": IDs
                        }
                    }
                }]
            }

已经试过了:Answer 和我的问题不一样

如果有人有任何问题,我会回答。任何帮助都会非常有帮助。谢谢

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb in-operator


    【解决方案1】:

    在这种情况下,您不能使用 IN 运算符 - Update。使用update 运算符,您必须将键值放入Update 对象。一个键包括partitionKeysortKey,我认为在你的情况下,你只需设置partitionKey

    要通过 ID 更新多个项目,您可以将多个 Update 对象放入TransactItems

    let IDs = await find('table', { type: 'some_type' }, 'type-index');
    
    let params = {
      TransactItems: [], // init empty array
    }
    
    IDs.forEach((ID) => {// loop though IDs array
      params.TransactItems.push({
        Update: {
          TableName: 'table',
          Key: {
            '_id': ID, // ID value
          },
          UpdateExpression: 'set #flag = :flag',
          ExpressionAttributeNames: {
            '#flag': 'flag',
            // '#_id': '_id' // remove this line
          },
          ExpressionAttributeValues: {
            ':flag': false,
            // ":IDs": IDs // remove this line
          }
        }
      })
    });
    // await client.transactWrite(params).promise()
    

    【讨论】:

    • 感谢您的回答。虽然我不允许使用循环,但现在我知道这不可能按照我想要的方式。我们会想办法的。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多