node.js - Dynamo DB 查询过滤器 Node.js
问题描述
通过 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 调用,该调用仅返回与zipCode
提供的邮政编码数组匹配的项目data.radius
,并且与提供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% 确定如何去做,所以如果有人能指出我正确的方向,那将是非常棒的,非常感谢!!
解决方案
我不确定您dynamodb-lib
指的是什么,但这里有一个示例,说明如何扫描给定值集中的属性 1 和不同值集中的属性 2。这使用标准 AWS JavaScript 开发工具包,特别是高级文档客户端。
请注意,您不能==
在此处使用相等 ( ) 测试,您必须使用包含 ( 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);
}
}
});
推荐阅读
- typescript - 云函数 typescript snapshot.val() 类型安全
- vb.net - AcroPdfLib 临时旋转页面
- debugging - Intel VT-x:配置调试寄存器以从主机调试
- charts - Visio - 如何减小巨型流程图的大小
- django - Django:访问 CreateView 中的表单参数以传递给 get_success_url
- spring-mvc - 在 Liferay 7 中部署时,升级的 Spring MVC portlet 抛出 org.w3c.dom.Document not found 异常
- jenkins - 在 Jenkins Pipeline 中使用全局变量
- google-play - Google Play 开发者帐户的税费是否超过 25 美元?
- angular - 尝试创建新的角度应用程序时出现奇怪的错误
- ant - 从 VSTS 构建将变量传递给 build.xml