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

如何在AWS Lambda(Node.js)中实现DynamoDB双条件查询?

在AWS Lambda(Node.js)中查询DynamoDB多条件匹配数据

假设你的DynamoDB表中id是分区键(主键),以下是两种实用的实现方式:

方式1:使用GetItem(高性能,适用于主键唯一场景)

GetItem会直接通过主键定位条目,再判断name是否匹配,是性能最优的方案:

const { DynamoDBClient, GetItemCommand } = require("@aws-sdk/client-dynamodb");
const { unmarshall } = require("@aws-sdk/util-dynamodb");

// 初始化DynamoDB客户端,替换为你的AWS区域
const client = new DynamoDBClient({ region: "us-east-1" });

exports.handler = async (event) => {
  try {
    const params = {
      TableName: "你的表名",
      Key: {
        id: { S: "1" } // S代表字符串类型,需与表中字段类型一致
      }
    };

    const command = new GetItemCommand(params);
    const response = await client.send(command);

    if (response.Item) {
      const item = unmarshall(response.Item);
      if (item.name === "John") {
        return {
          statusCode: 200,
          body: JSON.stringify(item)
        };
      } else {
        return {
          statusCode: 404,
          body: JSON.stringify({ message: "未找到匹配条件的条目" })
        };
      }
    } else {
      return {
        statusCode: 404,
        body: JSON.stringify({ message: "未找到id为1的条目" })
      };
    }
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: error.message })
    };
  }
};

方式2:使用Query配合过滤条件(适用于主键不唯一或批量过滤场景)

如果id不是唯一主键,或需要基于索引批量查询,可以用Query结合FilterExpression过滤name字段:

const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
const { unmarshall } = require("@aws-sdk/util-dynamodb");

const client = new DynamoDBClient({ region: "us-east-1" });

exports.handler = async (event) => {
  try {
    const params = {
      TableName: "你的表名",
      KeyConditionExpression: "id = :idVal", // 匹配分区键
      FilterExpression: "name = :nameVal", // 过滤name字段
      ExpressionAttributeValues: {
        ":idVal": { S: "1" },
        ":nameVal": { S: "John" }
      }
    };

    const command = new QueryCommand(params);
    const response = await client.send(command);

    // 将DynamoDB格式数据转换为普通JS对象
    const items = response.Items.map(item => unmarshall(item));

    return {
      statusCode: 200,
      body: JSON.stringify(items)
    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify({ error: error.message })
    };
  }
};

关键注意事项

  • 确保Lambda执行角色拥有dynamodb:GetItem或dynamodb:Query权限,避免权限报错。
  • 字段类型需与表中定义一致:S为字符串、N为数字、BOOL为布尔值等。
  • 若需频繁按id+name组合查询,建议设置复合主键(分区键id+排序键name),这样Query可直接命中索引,无需后续过滤,性能更佳。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:27:21