node.js - 如何基于多个(一个主要)属性 Lambda/NodeJS 从 DynamoDB 获取项目
问题描述
我在 DynamoDB 中的表结构如下所示:
uuid(主键)| 知识产权 | 用户代理
从 lambda 内部的 NodeJS 函数中,我想获取其 ip 和 useragent 与我提供的信息匹配的项目的 uuid。
Scan
随着每周数以百万计的项目被添加到表中,随着时间的推移变得越来越低效率和越来越昂贵。
这是我用来尝试完成此操作的代码:
function tieDown(sIP, uA){
const userQuery = {
Key : {
"ip" : "192.168.0.1",
"userAgent" : "sample"
},
TableName: "mytable"
};
return ddb.get(userQuery, function(err, data){
if (err) console.log(err.stack);
}).promise();
}
执行此代码时,将引发以下错误ValidationException: The provided key element does not match the schema
。
所以我想我的问题是:
- 是否甚至可以根据非主要属性获得一个特定的项目
- 我提供的代码示例是否有任何问题可能导致引发此错误?(我正在使用
DocumentClient
所以不需要显式声明字符串、数字等。
谢谢!
解决方案
get
如果不指定分区键和排序键(如果有),则无法使用该操作获取单个项目。在大多数情况下应避免扫描。您可能需要的是一个允许您query
通过ip
和userAgent
. 请记住,不能保证 GSI 上的记录是唯一的,因此您可能会得到多个结果。
推荐阅读
- c# - 用于 C# 应用程序的 PHP 控制的 MySQL 数据库
- android - Android 8.0 中没有用于 netty initChannel 的堆栈跟踪
- node.js - Prometheus 客户端不返回自定义指标
- git - 如何从存储库中的当前 git 分支中找到原始复制的 git 分支名称?
- c# - 将语音转换为文本 C#
- command-line-interface - Hyperledger 开发课程安装 CLI 失败
- swagger - 导入类型的必需值未显示在“示例值”列表中
- spring - 在 Spring Boot 中不使用异常作为流控制时的服务方法事务性
- haskell - (!!) 函数的递归定义
- html - 网站左侧降低