当前位置: 首页 > 知识库问答 >
问题:

节点。js AWS dynamodb updateItem

韩景辉
2023-03-14

有没有办法通过updateItem实现以下几点:1。如果DynamoDB 2中不存在属性,则添加属性。如果DynamoDB 3中存在属性,则更新属性。如果参数中不包含这些属性,请保持这些属性不变。

下面是一个例子:这是DynamoDB中的对象:

{
    id: "1234",
    variable1: "hello",
    variable2: "world"
}

以下是我想更新的输入:

{
    id: "1234",
    variable1: "hello2",
    variable23: "dog"  // the variable name "variable23" could be anything
}

下面是我想要实现的DynamoDB中的更新项:

{
    id: "1234",
    variable1: "hello2",
    variable2: "world",
    variable23: "dog"
}

“variable23”可以是任何变量名作为输入。

请帮忙!我使用node。js,如果有人能给我展示一些代码来实现这一点,我真的很感激。

谢谢

共有3个答案

沈开畅
2023-03-14

这里有一个更安全和最新的功能来实现这一点:

const {
  DynamoDBClient, UpdateItemCommand,
} = require('@aws-sdk/client-dynamodb');
const { marshall, unmarshall } = require('@aws-sdk/util-dynamodb');

const client = new DynamoDBClient({});

/**
 * Update item in DynamoDB table
 * @param {string} tableName // Name of the target table
 * @param {object} key // Object containing target item key(s)
 * @param {object} item // Object containing updates for target item
 */
const update = async (tableName, key, item) => {
  const itemKeys = Object.keys(item);

  // When we do updates we need to tell DynamoDB what fields we want updated.
  // If that's not annoying enough, we also need to be careful as some field names
  // are reserved - so DynamoDB won't like them in the UpdateExpressions list.
  // To avoid passing reserved words we prefix each field with "#field" and provide the correct
  // field mapping in ExpressionAttributeNames. The same has to be done with the actual
  // value as well. They are prefixed with ":value" and mapped in ExpressionAttributeValues
  // along witht heir actual value
  const { Attributes } = await client.send(new UpdateItemCommand({
    TableName: tableName,
    Key: marshall(key),
    ReturnValues: 'ALL_NEW',
    UpdateExpression: `SET ${itemKeys.map((k, index) => `#field${index} = :value${index}`).join(', ')}`,
    ExpressionAttributeNames: itemKeys.reduce((accumulator, k, index) => ({ ...accumulator, [`#field${index}`]: k }), {}),
    ExpressionAttributeValues: marshall(itemKeys.reduce((accumulator, k, index) => ({ ...accumulator, [`:value${index}`]: item[k] }), {})),
  }));

  return unmarshall(Attributes);
};
易雅畅
2023-03-14

可以动态更新属性。请参阅下面的代码。

export const update = (item) => {
  console.log(item)
  const Item = {
    note: "dynamic",
    totalChild: "totalChild",
    totalGuests: "totalGuests"
  };
  let updateExpression='set';
  let ExpressionAttributeNames={};
  let ExpressionAttributeValues = {};
  for (const property in Item) {
    updateExpression += ` #${property} = :${property} ,`;
    ExpressionAttributeNames['#'+property] = property ;
    ExpressionAttributeValues[':'+property]=Item[property];
  }

  
  console.log(ExpressionAttributeNames);


  updateExpression= updateExpression.slice(0, -1);
  
  
   const params = {
     TableName: TABLE_NAME,
     Key: {
      booking_attempt_id: item.booking_attempt_id,
     },
     UpdateExpression: updateExpression,
     ExpressionAttributeNames: ExpressionAttributeNames,
     ExpressionAttributeValues: ExpressionAttributeValues
   };

   return dynamo.update(params).promise().then(result => {
       return result;
   })
   
}
姜楷
2023-03-14

这正是AWS所说的。DynamoDB。DocumentClient的更新方法不起作用。

关于如何在节点中使用AWS SDK for JavaScript的更新方法,这里已经有一个示例代码。js。

例如:

'use strict';

const aws = require('aws-sdk');

// It is recommended that we instantiate AWS clients outside the scope of the handler 
// to take advantage of connection re-use.
const docClient = new aws.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {
    const params = {
        TableName: "MYTABLE",
        Key: {
            "id": "1"
        },
        UpdateExpression: "set variable1 = :x, #MyVariable = :y",
        ExpressionAttributeNames: {
            "#MyVariable": "variable23"
        },
        ExpressionAttributeValues: {
            ":x": "hello2",
            ":y": "dog"
        }
    };

    docClient.update(params, function(err, data) {
        if (err) console.log(err);
        else console.log(data);
    });
};
 类似资料:
  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • Text 节点的概念 文本节点(Text)代表元素节点(Element)和属性节点(Attribute)的文本内容。如果一个节点只包含一段文本,那么它就有一个文本子节点,代表该节点的文本内容。 通常我们使用父节点的firstChild、nextSibling等属性获取文本节点,或者使用Document节点的createTextNode方法创造一个文本节点。 // 获取文本节点 var textNo

  • Text节点的概念 Text节点的属性 data wholeText length nextElementSibling previousElementSibling Text节点的方法 appendData(),deleteData(),insertData(),replaceData(),subStringData() remove() splitText(),normalize() Docu

  • 负载均衡集群中的节点用于监听负载均衡实例,并将客户端的请求根据监听和转发规则将其转发给后端服务器。 负载均衡集群中的节点用于监听负载均衡实例,并将客户端的请求根据监听和转发规则转发给后端服务器。 同一个集群下可以有多个转发节点,但同一时刻只有一个节点作为Master节点提供转发服务。属于一个集群的节点的VRRP路由ID必须相同。 节点生命周期管理: 新建节点:设置节点的配置参数。 部署节点:将节点

  • 节点是Pod的实际运行环境。 该页面仅显示在云管平台创建的Kubernetes集群的节点信息。 一个Kubernetes集群由1~3个控制节点和n个计算节点组成。节点是Pod的实际运行环境。 控制节点(controlplane):即Master节点,由三个紧密协作的独立组件组合而成,它们分别是负责API服务的kube-apiserver、负责调度的kube-scheduler,以及负责容器编排的k

  • 所以我环顾了一下网络,在stackoverflow中有几个问题是定义: 通常,内部节点是任何不是叶子的节点(没有子节点) 非叶/非末端/内部节点-至少有一个度不等于0的子节点或后代节点 据我所知,它是一个节点,而不是一片叶子。 我即将得出结论,根也是一个内部节点,但它的定义似乎有些模糊,如图所示: 二元搜索树中的“内部节点”是什么? 正如这张精彩的图片所示,内部节点是位于树根和树叶之间的节点 如果

  • 在本章中,我们将详细介绍XPath表达式,其中包括常见的节点类型,XPath定义和句柄。 序号 节点类型 描述 1 Root XML文档的根元素节点。 2 Element 元素节点。 3 Text 元素节点的文本。 4 Attribute 元素节点的属性。 5 Comment 注释

  • GitBooks为插件提供了不同的节点 API和上下文。这些API可以根据使用的GitBook版本,你的插件应该在package.json中指定engines.gitbook字段。 Book实例 Book接口是GitBook的中心点,它集中了所有的访问读取方法。 //从book.json读取配置 var value = book.config.get('title','Default Value'