簡體   English   中英

Dynamo 數據庫查詢過濾器 Node.js

[英]Dynamo DB Query Filter 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'] data.availableServices ['Snow removal', 'Ice Removal', 'Salting', 'Same Day Response']

我正在嘗試進行 API 調用,該調用僅返回zipCode提供的郵政編碼數組中具有匹配zipCodedata.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 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);
    }
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM