代码之家  ›  专栏  ›  技术社区  ›  Praveen Raghav

使用多条件表达式的AWS DynamoDB更新项

  •  6
  • Praveen Raghav  · 技术社区  · 8 年前

    我有一个DynamoDB表,我希望使用多个条件表达式更新一个特定的值。我们能做到吗? 我的代码:-

            dynamodb = session.resource('dynamodb')
            table = dynamodb.Table('gold-images')
            response = table.update_item(
                Key={
                        'AccountRegionOS' : AccOs,
                        'CreationDate' : cred
                    },
                UpdateExpression="set is_active = :r",
                ConditionExpression="CreationDate < :num",
                ExpressionAttributeValues={
                    ':num' : last_month,
                    ':r': "No"
                },
                ReturnValues="UPDATED_NEW"
    

    我希望条件表达式为

            dynamodb = session.resource('dynamodb')
            table = dynamodb.Table('gold-images')
            response = table.update_item(
                Key={
                        'AccountRegionOS' : AccOs,
                        'CreationDate' : cred
                    },
                UpdateExpression="set is_active = :r",
                ConditionExpression=("CreationDate < :num") & ("AMIID = :ami"),
                ExpressionAttributeValues={
                    ':num' : last_month,
                    ':r': "No",
                    ':ami' : i
                },
                ReturnValues="UPDATED_NEW"
    
    2 回复  |  直到 8 年前
        1
  •  12
  •   Khalid T.    8 年前

    条件表达式为字符串,逻辑运算符为 AND ,则, OR NOT 。因此,您需要删除外圆括号并替换 & 具有 以及 :

    ConditionExpression = "CreationDate < :num AND AMIID = :ami"
    

    看见 Condition Expressions

        2
  •  0
  •   v.ng    4 年前

    对于使用AWS lambda更新DynamoDB表的用户,以下是一个示例:

    const AWS = require('aws-sdk');
    const documentClient = new AWS.DynamoDB.DocumentClient();
    
    const proxyResponseBody = ((statusCode, result) => {
      let response = {
        statusCode: statusCode,
        body: JSON.stringify({ result: result }),
        headers: { "Access-Control-Allow-Origin": "*" }
      }
      return response;
    })
    
    exports.handler = async (event) => {
      // TODO implement
      console.log(event);
      const jsonData = JSON.parse(event.body)
      const userId = event.requestContext.authorizer.claims.sub
      const params = {
        TableName : "Some_Table_Name",
        Key: {
          "ID": jsonData.tableKeyId,
        },
        UpdateExpression: "set someField = :newValue",
        ConditionExpression: "userId = :userId",
        ExpressionAttributeValues: {
          ":newValue": jsonData.newValue,
          ":userId": userId,
        },
      }
      console.log(params)
      let result = null
      let statusCode = null
      result = await documentClient.update(params, function(err, data) {
        if (err) {
          console.log(err)
          statusCode = 500
          return err
        }else {
          console.log(data);
          statusCode = 200
          return data
        }
      }).promise();
      return proxyResponseBody(statusCode, result)
    };
    

    该表由分区键“ID”、“userId”和“fieldName”组成。此函数用于更新具有匹配用户ID的行的“fieldName”值。