You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS AppSync JavaScript Resolver实现DynamoDB多状态批量查询

问题描述

需要编写AWS AppSync的JavaScript请求模板,实现从DynamoDB中查询所有ReviewStatus字段匹配status数组中任一值的条目。已知status为字符串时的实现代码,但尝试用or表达式实现数组匹配时无效,且仅能找到VTL模板的批量查询资料,未找到JavaScript模板的相关内容。

附现有代码:

字符串版可正常运行代码

import { util } from '@aws-appsync/utils';

export function request(ctx) {
  const { limit = 20, nextToken, status } = ctx.arguments;
  const index = 'ReviewStatus-index';
  const query = JSON.parse( 
    util.transform.toDynamoDBFilterExpression({ 
        ReviewStatus: { 
             eq: status 
        } 
    })
  );
  
  return { operation: 'Query', index, query, limit, nextToken };
}

export function response(ctx) {
  const { items, nextToken } = ctx.result;
  return { items, nextToken };
}

尝试无效的数组版代码

import { util } from '@aws-appsync/utils';

export function request(ctx) {
  const { limit = 20, nextToken, status } = ctx.arguments;
  const index = 'ReviewStatus-index';
  const query = JSON.parse( 
    util.transform.toDynamoDBFilterExpression({
        "or": status.map( s => ({ ReviewStatus: { eq: s } }))
    })
  );
  
  return { operation: 'Query', index, query, limit, nextToken };
}

export function response(ctx) {
  const { items, nextToken } = ctx.result;
  return { items, nextToken };
}
解决方案

直接使用DynamoDB原生的in操作符即可实现匹配数组中任一值的需求,无需手动构建or表达式。AppSync的util.transform.toDynamoDBFilterExpression工具支持解析in操作符,具体代码如下:

import { util } from '@aws-appsync/utils';

export function request(ctx) {
  const { limit = 20, nextToken, status } = ctx.arguments;
  const index = 'ReviewStatus-index';
  // 使用in操作符传入status数组,匹配任一元素
  const query = JSON.parse( 
    util.transform.toDynamoDBFilterExpression({ 
        ReviewStatus: { 
             in: status 
        } 
    })
  );
  
  return { operation: 'Query', index, query, limit, nextToken };
}

export function response(ctx) {
  const { items, nextToken } = ctx.result;
  return { items, nextToken };
}

说明

  • in操作符是DynamoDB官方支持的查询条件,用于匹配属性值属于指定数组中的任一元素,比手动构建多个eq的or表达式更简洁高效。
  • 需确保ReviewStatus-index全局二级索引(GSI)是以ReviewStatus作为分区键,这样查询可以正确命中索引,避免全表扫描。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:07:26