【问题标题】:update(add) dynamodb with lambda function使用 lambda 函数更新(添加)dynamodb
【发布时间】:2019-07-02 03:16:57
【问题描述】:

我做了很多研究,对于像我这样的后辈来说,这个话题没有足够的来源。我能找到的一切都是特定的案例,这使得它无法理解。因此,对于我自己和将来会读到这篇文章的人来说,我不会让我的问题过于具体。

我使用以下 lambda 函数在 DynamoDB 上创建了一个表记录:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2', apiVersion: '2012-08-10'})

exports.handler = (event, context, callback) => {
    console.log(event)

    const params = {
        Item: {
            "UserId": {
                S: "global" 
            },
            "search": {
                        SS: [
                             "" + event.hashtag
                            ]
            }
        },
        TableName: "crypto-app"
    };
    dynamodb.putItem(params, function(err, data) {
        if (err) {
            callback(err)
        } else {
            callback(null, data)
        }
    });
};

这是创建一个简单的字符串集

 {
  "search": {
    "SS": [
      "london"
    ]
  },
  "UserId": {
    "S": "global"
  }
}

如何使用 lambda 函数将更多字符串添加到我的字符串集以使其成为这样?

{
  "search": {
    "SS": [
      "london", "tokyo", "moskow" 
    ]
  },
  "UserId": {
    "S": "global"
  }
}

【问题讨论】:

  • 非常感谢沃尔特,我当然会做 :)

标签: javascript node.js amazon-web-services aws-lambda amazon-dynamodb


【解决方案1】:

您可以更新项目并添加其他字符串集值。

如果您将属性命名为xxx 而不是search(即reserved word),您会这样做。

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2'});

const params = {
  Key: {
    UserId: {
      S: 'global',
    },
  },
  UpdateExpression: 'ADD xxx :avals',
  ExpressionAttributeValues: {
    ':avals': {
      SS: ['tokyo', 'moskow'],
    },
  },
  TableName: 'crypto-app',
};

dynamodb.updateItem(params, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

但是,因为您将属性命名为 search,它是保留的,所以您需要使用 expression attribute name 实质上转义该保留名称,这是您在表达式中使用的占位符,作为实际属性的替代名字。

以下是您如何执行此操作的示例:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2'});

const params = {
  Key: {
    UserId: {
      S: 'global',
    },
  },
  UpdateExpression: 'ADD #a :avals',
  ExpressionAttributeValues: {
    ':avals': {
      SS: ['tokyo', 'moskow'],
    },
  },
  ExpressionAttributeNames: {
    '#a': 'search',
  },
  TableName: 'crypto-app',
};

dynamodb.updateItem(paramse, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

另一种可能更好的方法是使用 DynamoDB DocumentClient。它是一个更高级别的客户端界面,它通过抽象出属性值的概念并使用原生 JavaScript 类型来简化对项目的处理。

使用 DocumentClient,无需显式编写 UserId: { 'S': 'global' },您只需使用 UserId: 'global' 即可推断字符串类型 ('S')。

以下是使用 DocumentClient 更新项目的示例:

const AWS = require('aws-sdk');
const dc = new AWS.DynamoDB.DocumentClient({region: 'us-east-2'});

const params = {
  Key: {
    UserId: 'global',
  },
  UpdateExpression: 'ADD #a :avals',
  ExpressionAttributeValues: {
    ':avals': dc.createSet(['tokyo', 'moskow']),
  },
  ExpressionAttributeNames: {
    '#a': 'search',
  },
  TableName: 'crypto-app',
};

dc.update(params, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

【讨论】:

  • 非常感谢,在您回复之前我已经找到了类似的解决方案,但这个解决方案更好更完美。非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2017-09-05
  • 2021-01-24
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多