Node.js中查询DynamoDB数组JSON字段含指定属性元素的方法
解决方案
核心原理
DynamoDB 原生支持通过数组过滤函数实现任意位置元素的部分字段匹配,不需要指定数组下标,Node.js AWS SDK 完全支持该语法。
实现方式
方式1:直接编写FilterExpression(兼容SDK v2、v3)
你可以通过filter数组函数遍历receiver数组的每个元素,判断是否存在符合条件的元素,再通过size函数判断过滤后的结果长度是否大于0即可。
示例代码(以AWS SDK v3的DocumentClient为例,v2写法完全一致):
import { DynamoDBClient, ScanCommand } from "@aws-sdk/client-dynamodb"; import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; const client = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(client); const params = { TableName: "你的表名", // 若存在分区键/排序键的查询条件,写在KeyConditionExpression中优先走Query提升性能 FilterExpression: "size(filter(r in receiver, r.receiver_id = :targetId)) > :zero", ExpressionAttributeValues: { ":targetId": "r1", ":zero": 0 } }; const command = new ScanCommand(params); const response = await docClient.send(command); console.log(response.Items);
方式2:使用SDK表达式构建器(SDK v3专属,等价于Boto3的Attr写法)
AWS SDK v3提供了官方表达式构建工具,写法和Boto3的Attr调用逻辑一致:
import { filter, size, gt, attribute } from '@aws-sdk/util-dynamodb/expression-builders'; const filterExpr = gt( size( filter( 'r', // 数组遍历的临时变量名 attribute('receiver'), // 要遍历的数组字段 attribute('r.receiver_id').eq('r1') // 每个元素的匹配规则 ) ), 0 ); const params = { TableName: "你的表名", FilterExpression: filterExpr, ExpressionAttributeValues: filterExpr.values(), };
补充说明
如果你的业务场景可以接受完全匹配数组内的对象(即需要同时匹配receiver_id和receiver_name两个字段),可以简化为使用contains函数:
const params = { TableName: "你的表名", FilterExpression: "contains(receiver, :targetReceiver)", ExpressionAttributeValues: { ":targetReceiver": { receiver_id: "r1", receiver_name: "a" } } }
该方法仅适用于对象全匹配场景,无法实现单个字段的模糊匹配。
内容的提问来源于stack exchange,提问作者Also James
相关产品推荐
相关产品推荐

