Dynamodb 查询过滤器 Node.js
Posted
技术标签:
【中文标题】Dynamodb 查询过滤器 Node.js【英文标题】:Dynamo DB Query Filter Node.js 【发布时间】:2020-04-30 08:02:56 【问题描述】:通过 AWS 运行 Node.js 无服务器后端。
主要目标:过滤并列出所有本地作业(表格项),其中包括提供给过滤器的可用服务和邮政编码。
我传递了多个邮政编码和多个可用服务。
data.radius
将是一个邮政编码数组 = 类似于:[ '93901', '93902', '93905', '93906', '93907', '93912', '93933', '93942', '93944', '93950', '95377', '95378', '95385', '95387', '95391' ]
data.availableServices
也将是一个数组 = 类似于 ['Snow removal', 'Ice Removal', 'Salting', 'Same Day Response']
我正在尝试进行 API 调用,该调用仅返回与data.radius
提供的邮政编码数组中匹配的zipCode
的项目,并且packageSelected
与提供的数组data.availableServices
匹配。
API 调用
import * as dynamoDbLib from "./libs/dynamodb-lib";
import success, failure from "./libs/response-lib";
export async function main(event, context)
const data = JSON.parse(event.body);
const params =
TableName: "jobs",
FilterExpression: "zipCode = :radius, packageSelected = :availableServices",
ExpressionAttributeValues:
":radius": data.radius,
":availableServices": data.availableServices
;
try
const result = await dynamoDbLib.call("query", params);
// Return the matching list of items in response body
return success(result.Items);
catch (e)
return failure( status: false );
我是否需要先映射邮政编码数组和可用服务才能使其工作?
我应该使用比较运算符吗? https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html
查询和过滤是否需要排序键值或分区键? (该表有一个排序键和分区键,但我想避免在此调用中使用它们)
我不能 100% 确定如何去做,所以如果有人能指出我正确的方向,那将是非常棒的,非常感谢!!
【问题讨论】:
仍在尝试解决这个问题!哈哈,它是一只狗。 【参考方案1】:我不确定您的 dynamodb-lib
指的是什么,但这里有一个示例,说明如何扫描给定值集中的属性 1 和不同值集中的属性 2。这使用标准 AWS javascript SDK,特别是高级文档客户端。
请注意,您不能在此处使用相等 (==
) 测试,您必须使用包含 (IN
) 测试。而且你不能使用query
,但必须使用scan
。
const AWS = require('aws-sdk');
let dc = new AWS.DynamoDB.DocumentClient('region': 'us-east-1');
const data =
radius: [ '93901', '93902', '93905', '93906', '93907', '93912', '93933', '93942', '93944', '93950', '95377', '95378', '95385', '95387', '95391' ],
availableServices: ['Snow removal', 'Ice Removal', 'Salting', 'Same Day Response'],
;
// These hold ExpressionAttributeValues
const zipcodes = ;
const services = ;
data.radius.forEach((zipcode, i) =>
zipcodes[`:zipcode$i`] = zipcode;
)
data.availableServices.forEach((service, i) =>
services[`:services$i`] = service;
)
// These hold FilterExpression attribute aliases
const zipcodex = Object.keys(zipcodes).toString();
const servicex = Object.keys(services).toString();
const params =
TableName: "jobs",
FilterExpression: `zipCode IN ($zipcodex) AND packageSelected IN ($servicex)`,
ExpressionAttributeValues : ...zipcodes, ...services,
;
dc.scan(params, (err, data) =>
if (err)
console.log('Error', err);
else
for (const item of data.Items)
console.log('item:', item);
);
【讨论】:
对我的应用程序稍作调整,就可以了!非常感谢!以上是关于Dynamodb 查询过滤器 Node.js的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 node.js 中使用 Model.find() 查询和填充字段过滤器
在 AWS Amplify GraphQL DynamoDB 中按另一个表的字段(也称为交叉表或嵌套过滤)过滤列表查询
node.js 与 express 如何从 url 中删除查询字符串
在使用 Java 的 DynamoDB 扫描中使用包含过滤器