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 扫描中使用包含过滤器

AWS - 在 DynamoDB 表中放置一个 GeoPoing 并对其进行查询 - node.js

在代码中使用 DynamoDB 过滤器表达式或过滤器哪个更好? [关闭]