node.js - 想要检索特定分区键结构的结果?
问题描述
我的用例
我有一个表名Test
,分区键为 as userId
,排序键为campaignId
. 我的桌子看起来像这样
"userId (S)","noteId (S)","BName (S)","BValue (S)"
"123_x","123","hi","no"
"123_x","213","how","yes"
"123_x","321","are","yes"
"456_y","456","you","yes"
"456_y","546","i","yes"
"456_y","654","have","yes
现在我正在尝试检索包含分区键的项目x
。为此,我使用了以下 node.js 代码
var AWS = require("aws-sdk");
AWS.config.update({
region: "ap-south-1",
endpoint: "http://dynamodb.ap-south-1.amazonaws.com"
});
var docClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName : "Test",
ProjectionExpression:"userId,BName,BValue",
KeyConditionExpression: "contains(#userId,:userid)",
ExpressionAttributeNames:{
"#userId": "userId"
},
ExpressionAttributeValues: {
":userid": "x"
}
};
docClient.query(params, function(err, data) {
if (err) {
console.log("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) {
console.log(JSON.stringify(item));
});
}
});
我收到这样的错误:
Unable to query. Error: {
"message": "Invalid operator used in KeyConditionExpression: contains",
"code": "ValidationException",
"time": "2018-08-23T17:59:01.094Z",
"requestId": "O6PL6NSE1BR7QLGA4U1SOIKGJ7VV4KQNSO5AEMVJF66Q9ASUAAJG",
"statusCode": 400,
"retryable": false,
"retryDelay": 34.77326742946143
}
看来我不能在关键条件表达式中使用 contains。解决方法是什么?
任何帮助表示赞赏
谢谢
解决方案
没有一个。在执行 DynamoDB 查询时,您必须始终指定准确的分区键。在不重新设计表的情况下,您唯一的选择是执行扫描并在 userId 上使用过滤器表达式。
为了避免表扫描的费用,您可以在表上添加一个名为“userId_suffix”的字段,并使用示例中的“x”和“y”类型值填充它。然后,您将在“userId_suffix”上创建一个全局二级索引并在其上查询“x”。
推荐阅读
- git - git试图从本地推送已删除的文件
- javascript - 用(查找和过滤)替换对象数组中的所有状态不起作用
- python - 如何在 pycharm 中使用 tkinter 打开 python 代码来编辑代码?
- machine-learning - 分层K折后怎么办?
- javascript - 如何用单一功能在单页中实现多类型元素
- postgresql - 尝试克隆 postgres 数据库时出错(pg_dump、pg_restore)
- python - 有没有人尝试过使用“NuScenes 数据集”?
- flutter - 如何:根据传入数据更新(并允许更改)下拉菜单
- sql - SQL 更新多个值
- reactjs - 在子路由上找不到反应构建静态