如何在NodeJS中解析DynamoDB嵌套JSON并提取指定Type的Filter对象
从DynamoDB嵌套JSON中提取指定Filter对象
我在DynamoDB中存储了结构复杂的嵌套JSON数据,想要从中提取特定Type对应的Filter对象及其值。比如当Type为macBook时,返回包含PRO和AIR的Filter对象。目前用Node.js解析时无法获取目标Filter对象,附上JSON数据和product.js代码,求解决方法。
JSON数据
{ "ProductType": { "S": "Apple" }, "Type": { "M": { "iPhone": { "M": { "Filter": { "M": { "model": { "SS": [ "X", "XS" ] } } } } }, "macBook": { "M": { "Filter": { "M": { "model": { "SS": [ "PRO", "AIR" ] } } } } } } } }
product.js代码
const AWS = require('aws-sdk'); var dynamodb = new AWS.DynamoDB({ region: process.env.AWS_REGION, }); const getModel = function (productType) { return new Promise((resolve, reject) => { var params = { Key: { "ProductType": { S: productType } }, TableName: 'product' }; dynamodb.getItem(params, function (err, data) { if (err) reject(err, err.stack); else { console.log("data: " + Object.keys(data)); let product = data.Item.ProductType.S; let filterModel = data.Item.Type.M console.log(filterModel); } }); }); } getModel('Apple')
解决方法
DynamoDB返回的原生数据带有类型标识(如S、M、SS),需要逐层解析这些嵌套结构才能拿到目标Filter对象。以下是修改后的代码,支持提取指定Type对应的Filter:
const AWS = require('aws-sdk'); var dynamodb = new AWS.DynamoDB({ region: process.env.AWS_REGION, }); const getModel = function (productType, targetType) { return new Promise((resolve, reject) => { var params = { Key: { "ProductType": { S: productType } }, TableName: 'product' }; dynamodb.getItem(params, function (err, data) { if (err) return reject(err); if (!data.Item) return resolve(null); // 逐层解析嵌套的DynamoDB结构 const typeMap = data.Item.Type.M; const targetProduct = typeMap[targetType]?.M; if (!targetProduct) return resolve(null); const filterData = targetProduct.Filter.M; // 提取Filter对象,直接取SS类型的数组值 const filter = { model: filterData.model.SS }; resolve(filter); }); }); } // 调用示例:获取Apple分类下macBook的Filter对象 getModel('Apple', 'macBook') .then(filter => console.log('提取到的Filter对象:', filter)) .catch(err => console.error('查询错误:', err));
代码说明
- 新增
targetType参数,可灵活指定要提取的产品类型(如macBook) - 使用可选链操作符
?.避免因目标类型不存在导致的报错 - 直接解析DynamoDB的类型标识:
M对应嵌套对象,SS对应字符串数组,最终返回格式化后的Filter对象 - 增加了数据不存在、目标类型不存在等异常情况的处理
内容的提问来源于stack exchange,提问作者Brady Maf
相关产品推荐
相关产品推荐

