Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >具有动态属性和原子计数器的DynamoDB.DocumentClient

具有动态属性和原子计数器的DynamoDB.DocumentClient
EN

Stack Overflow用户
提问于 2021-10-10 16:58:48
回答 2查看 307关注 0票数 1

我正在使用一个用例,在这个用例中dynamoDB更新应该:

动态重新插入(如果存在更新,插入(如果不存在)项),而不硬编码项目的components.

  • Use -- DynamoDB文档客户端以简化

  • ,并且在相同的原子操作中,更新一个简单的计数器

我从https://stackoverflow.com/a/63511693/15369972的Daniel的一个出色的实用程序方法开始,它为动态值的更新提供了一个通用的实用工具方法,但是没有原子计数器。

在加载动态值之后,我尝试通过将计数器及其增量器添加到参数对象中来添加原子计数器功能,但是在update时将在计数器中获得一个静态值,而不是在每次调用时增加一个值。

这是哪里出了问题?我使用表名、动态javascript对象和包含散列和排序键的数组调用修改后的update函数:

await update(tableName, jsonObjectToStore, ['myHashKey', 'mySortKey'])

修改后的update方法没有像我所希望的那样递增,它是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function update (tableName, item, idAttributeNames) {

    var params = {
        TableName: tableName,
        Key: {},
        ExpressionAttributeValues: {},
        ExpressionAttributeNames: {},
        UpdateExpression: "",
        ReturnValues: "UPDATED_NEW"
    };

    for (const attname of idAttributeNames) {
        params["Key"][attname] = item[attname];
    }

    let prefix = "set ";
    let attributes = Object.keys(item);
    for (let i=0; i<attributes.length; i++) {
        let attribute = attributes[i];
        if (!idAttributeNames.includes(attribute)) {
            params["UpdateExpression"] += prefix + "#" + attribute + " = :" + attribute;
            params["ExpressionAttributeValues"][":" + attribute] = item[attribute];
            params["ExpressionAttributeNames"]["#" + attribute] = attribute;
            prefix = ", ";
        }
    }
    
    // Add the counter
    params["UpdateExpression"] +=  ", #nImports = :nImports + :incr";
    console.log(params["UpdateExpression"])
    
    console.log(params["ExpressionAttributeValues"])
    params["ExpressionAttributeValues"][":incr"] = 1;
    params["ExpressionAttributeValues"][":nImports"] = 0;
    console.log(params["ExpressionAttributeValues"])
        
    console.log(params["ExpressionAttributeNames"])
    params["ExpressionAttributeNames"]["#nImports"] = 'nImports'
    console.log(params["ExpressionAttributeNames"])
    
    await docClient.update

    return await docClient.update(params).promise();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-15 11:45:27

与AWS支持一起找到一个合理的解决方案。他们也不确定如何使用ddb文档客户端来执行原子计数器(相对于有许多文档示例的低级客户机),但建议使用ADD命令,这会产生数字字段原子更新的副作用。

因此,通过下面的示例,我们从要存储的对象构造动态更新,然后在update表达式中追加ADD语句(没有逗号!),并将实际上是数字增量的内容添加到ExpressionAttributeValues for nImports中。就像这样,这应该是一个完整的工作λ示例。有几个console.log语句可以显示正在发生的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
async function update (tableName, item, idAttributeNames) {
    var params = {
        TableName: tableName,
        Key: {},
        ExpressionAttributeValues: {},
        ExpressionAttributeNames: {},
        UpdateExpression: "",
        ReturnValues: "UPDATED_NEW"
    };

    for (const attname of idAttributeNames) {
        params["Key"][attname] = item[attname];
    }

    let prefix = "set ";
    let attributes = Object.keys(item);
    for (let i=0; i<attributes.length; i++) {
        let attribute = attributes[i];
        if (!idAttributeNames.includes(attribute)) {
            params["UpdateExpression"] += prefix + "#" + attribute + " = :" + attribute;
            params["ExpressionAttributeValues"][":" + attribute] = item[attribute];
            params["ExpressionAttributeNames"]["#" + attribute] = attribute;
            prefix = ", ";
        }
    }
    console.log('params before adding atomic counter is:', params)
    // Add the counter using the ADD syntax
    params["UpdateExpression"] +=  " ADD #nImports :nImports"
    params["ExpressionAttributeValues"][":nImports"] = 1;
    params["ExpressionAttributeNames"]["#nImports"] = 'nImports'

    console.log('params after adding atomic counter is:', params)
    
    try {
        const result = await docClient.update(params).promise();
        console.log('after await, result is ', result);
        return result;
    } catch (err) {
        console.log('err is ', err)
    }
};



exports.handler = async (event) => {
    
    const item = {title: 'sometitle', site_url: "www.amazon.com", key: "G"};
    const body = await update('test_table', item, ['title', 'site_url']);
    const response = {
        statusCode: 200,
        body: JSON.stringify(body),
    };
    return response;
}
票数 0
EN

Stack Overflow用户

发布于 2021-10-16 08:42:40

AWS的好心人做了更多的挖掘工作,并指出了初始代码中的一个错误,在纠正后,应该按照需要使用SET操作符进行增量。

基本上,原始代码没有正确地将变量作为增量的目标。因此,我们添加递增变量的校正版本应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    console.log('params before adding atomic counter is:', params)
    // Add the counter
    params["UpdateExpression"] += ", #nImports = #nImports + :incr";
    params["ExpressionAttributeValues"][":incr"] = 1;
    //params["ExpressionAttributeValues"][":nImports"] = 0;
    params["ExpressionAttributeNames"]["#nImports"] = 'nImports'

    console.log('params after adding atomic counter is:', params)```

I'm sticking with the original ADD answer because I like the differentiation it gives over the properties inserted by the SET, but both seem valid and I wanted to include the correction as well
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69520042

复制
相关文章
MySQL数据库:SQL语句的执行过程
我们的系统在和 MySQL 数据库进行通信前,需要先和数据库建立连接,而这个功能就是由MySQL驱动底层帮我们完成的,建立完连接之后,我们只需要发送 SQL 语句就可以执行 CRUD 了。如下图所示:
全栈程序员站长
2022/06/29
3.6K0
MySQL数据库:SQL语句的执行过程
SQL语句执行与结果集的获取
title: SQL语句执行与结果集的获取 tags: [OLEDB, 数据库编程, VC++, 数据库] date: 2018-01-28 09:22:10 categories: windows 数据库编程 keywords: OLEDB, 数据库编程, VC++, 数据库,执行SQL, 获取结果集 --- 上次说到命令对象是用来执行SQL语句的。数据源在执行完SQL语句后会返回一个结果集对象,将SQL执行的结果返回到结果集对象中,应用程序在执行完SQL语句后,解析结果集对象中的结果,得到具体的结果,这次的主要内容是如何解析结果集对象并获取其中的值。
Masimaro
2018/08/31
3.9K0
SQL如何在数据库中执行
数据库的服务端,可分为执行器(Execution Engine) 和 存储引擎(Storage Engine) 两部分:
JavaEdge
2023/01/06
3.1K0
SQL如何在数据库中执行
数据库SQL语句大全——最常用的SQL语句
检索数据: 检索单个列: SELECT pname FROM product 检索多个列: SELECT pname,market_price,is_hot FROM product 检索所有列: SELECT * FROM product 过滤检索结果中的重复数据: SELECT DISTINCT market_price FROM product DISTINCT关键字: 1、返回不同的值,使用时放在列名的前面 2、多查询一个及以上列时,除非你查询的所有列的数据都不同,否则所有行都将被检索出来
说故事的五公子
2019/09/29
3K0
批量添加的sql语句_批量执行sql语句
mysql允许我们在一条sql语句中批量插入数据(中间逗号分隔),如下sql语句:
全栈程序员站长
2022/11/09
4.7K0
SQL 语句的执行顺序
id 代表客服人员的 id,client 代表与该客服人员通话的客户的 id,也是说,每有一条记录,就代表一个客服与一位客户进行了通话,相同的记录,例如第一行和第七行,代表着 1 号客服与 001 号客户在不同的时间进行了两次通话,问:如下 SQL 可否统计出与客户通话次数大于 1 客服 id?
CoderJed
2018/12/28
3.6K0
Oracle 数据库sql语句查看字符集,PG数据库查询字符集方法
【Oracle 数据库查询字符集】 查询出 NLS_NCHAR_CHARACTERSET 参数的值即是数据库的字符集。
小蓝枣
2021/12/01
1.6K0
Oracle 数据库sql语句查看字符集,PG数据库查询字符集方法
数据库mysql的执行顺序(sql语句大全实例教程)
今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序:
全栈程序员站长
2022/07/29
1.6K0
SQL|语句执行逻辑
01 SQL SQL,脚本查询语言,处理代码的顺序不是按照脚本语言的顺序,这点是不同于其他编程语言的最明显特征。 SQL语言常见的比如,Mysql,HiveQL,Oracle等,虽然语法上存在一些差异,但它们在解释查询脚本上,尤其是在解析语句执行顺序上具有共性。如果将脚本语言分解为一系列的语句,那么这些语句的先后执行顺序是怎样的呢? 这篇文章,主要总结SQL语句的执行顺序。 02 Select语句执行顺序 select查询语句的执行顺序,可以看出首先执行FROM子句,最后执行ORDER BY 执行顺序:
double
2018/04/02
3.2K0
走进黑盒:SQL是如何在数据库中执行的?
对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知道为什么要遵循这些规则,也就谈不上灵活运用。
码农架构
2020/11/17
1.9K0
走进黑盒:SQL是如何在数据库中执行的?
走进黑盒:SQL是如何在数据库中执行的?
对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知道为什么要遵循这些规则,也就谈不上灵活运用。
码农架构
2020/11/11
1.7K0
走进黑盒:SQL是如何在数据库中执行的?
sql数据库查询语句大全_sql基本语句大全
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/05
2.1K0
SQL数据库查询语句
select语句除了可以查看数据库中的表格和视图的信息外,还可以查看SQL Server的系统信息、复制、创建数据表。其查询功能强大,是SQL语言的灵魂语句,也是SQL中使用频率最高的语句。
全栈程序员站长
2022/08/29
4.3K0
讲解SQL数据库语句
(1)完全函数依赖:(学号、课程号) →f 成绩 (2)部分函数依赖 :(学号、课程号) →p 姓名 (3)传递函数依赖 :学号→所属系号,所属系号→宿舍楼号,学号→t宿舍楼号
达达前端
2019/07/03
1.9K0
讲解SQL数据库语句
数据库中的having语句_sql的having语句
HAVING语句通常与GROUP BY子句及聚集函数COUNT,AVG,SUM,MAX,MIN语句联合使用,用来过滤由GROUP BY语句返回的记录集,通常跟在GROUP BY后边作用相当于WHERE。
全栈程序员站长
2022/10/03
2.2K0
数据库sql语句的exists总结
--deals=交易表,areas=地域表,例如中国香港;我们的目的:查看有交易的地域
用户7353950
2022/05/10
9530
浅谈SQL语句的执行过程
写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序。可以有时间自己写一个简单的数据库,理解会更加深入。下面就写写我的一些理解,以SQL SERVER2008为例,进行说明。
哲洛不闹
2018/09/19
1.4K0
浅谈SQL语句的执行过程
SQL语句执行的底层实现
Server层包含MySQL的大多数核心服务,和所有内置函数,所有跨存储引擎功能的实现
素履coder
2022/02/17
1.6K0
SQL语句执行的底层实现
MySQL执行sql语句的机制
查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
Java技术债务
2022/08/09
3.8K0
数据库基本----SQL语句大全
EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'
阳光岛主
2019/02/19
6.2K0

相似问题

如何对数据集执行SQL语句

100

大型数据集上的Sql语句

30

来自几个access数据库的大型数据集上的r- SQL

21

来自DolphinDB数据库中sql语句的向量

11

合并来自2个数据库的sql语句

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文