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

NodeJS优化重复销售记录查询:获取客户购买的唯一产品

优化DynamoDB销售记录查询:去重+降延迟

原代码核心问题分析

  1. 查询效率低下:使用Scan全表扫描+contains模糊匹配,远不如精准查询或Query高效;且返回了全量字段,增加数据传输开销。
  2. 去重逻辑失效:data.filter(...) != undefined判断永远为真(filter返回数组,空数组也不是undefined),导致同一产品被重复查询并添加。
  3. 串行请求拖慢速度:循环内串行调用await getProduct,N个产品请求需要N倍的单请求时间,延迟叠加。

优化方案与代码实现

1. 优先改用Query提升查询性能

如果dbSales表的分区键是clientID,直接用Query替代Scan(DynamoDB中Query是针对分区键的高效查询,远优于全表扫描的Scan),同时只返回需要的productId字段减少数据传输。

2. 提取唯一产品ID避免重复查询

用Set存储已出现的productId,自动去重后转成数组。

3. 并行请求产品信息降低延迟

用Promise.all同时发起所有产品信息查询,将串行请求改为并行,大幅缩短总耗时。

完整优化代码

public async getData(clientID: any): Promise<any> {
  try {
    // 用Query替代Scan(如果clientID是分区键,性能提升显著)
    const response = await client.query({
      TableName: "dbSales",
      KeyConditionExpression: "clientID = :clientID",
      ExpressionAttributeValues: { ":clientID": clientID },
      ProjectionExpression: "productId" // 仅返回需要的字段,减少数据传输
    }).promise();

    // 提取唯一的productId集合
    const uniqueProductIds = new Set(response.Items.map(item => item.productId));
    const productIds = Array.from(uniqueProductIds);

    // 并行查询所有产品信息
    const productData = await Promise.all(
      productIds.map(id => this.getProduct(id))
    );

    return {
      status: 200,
      data: productData
    };
  } catch (e) {
    throw new HttpError(500, e.message);
  }
}

额外优化建议

  • 表结构优化:如果频繁需要按clientID查询已购产品,建议将clientID设为分区键、productId设为排序键,这样Query可以直接返回唯一的产品记录;甚至可以在dbSales表中存储产品基础信息,彻底省去getProduct调用。
  • 缓存产品信息:如果产品数据更新不频繁,用Redis等缓存工具缓存getProduct的结果,进一步降低查询延迟。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:35:24