MongoDB聚合结果转CSV:嵌套JSON对象字段访问语法问题
解决MongoDB嵌套特殊字段的访问与CSV转换问题
问题核心
你的问题出在嵌套数组中的特殊字段访问:ICECAT-interface包含连字符、@ID/@Name带@符号,这些字段名不符合JavaScript合法标识符规则,无法直接用.点语法访问;同时part_number_info是数组,必须先取数组元素再逐层访问。
方案1:优化聚合查询(推荐,减少后续遍历复杂度)
直接在聚合阶段把嵌套字段提取为顶层字段,后续生成CSV时更简单。修改你的$project阶段:
cursor = db.csv_import.aggregate([ { $lookup: { from: 'EN', let: { pn: '$part_no', vendor: '$vendor_standard' }, pipeline: [{ $match: { $expr: { $and: [ { $eq: ["$$pn", "$ICECAT-interface.Product.@Prod_id"] }, { $eq: ["$$vendor", "$ICECAT-interface.Product.Supplier.@Name"] } ] } } }], as: 'part_number_info' } }, { $match: { "part_number_info.0": { $exists: true } } }, // 关键修改:提取数组第一个元素的嵌套字段,转为易访问的顶层字段 { $project: { part_no: 1, product_id: { $arrayElemAt: ["$part_number_info.ICECAT-interface.Product.@ID", 0] }, supplier_name: { $arrayElemAt: ["$part_number_info.ICECAT-interface.Product.Supplier.@Name", 0] }, _id: 0 } } ]);
此时查询结果会变成扁平化结构:
{ "part_no": "C28-00002", "product_id": "344038", "supplier_name": "Microsoft" }
遍历游标生成CSV的代码会非常简洁:
while (cursor.hasNext()) { const item = cursor.next(); print(`${item.part_no},${item.product_id},${item.supplier_name}`); }
方案2:直接在游标遍历中访问嵌套特殊字段
如果不想修改聚合查询,需要用方括号+字符串字段名的方式访问特殊字段,同时先取出数组元素:
while (cursor.hasNext()) { const jsonObject = cursor.next(); // 取出part_number_info数组的第一个元素 const partInfo = jsonObject.part_number_info[0]; // 用[]访问带特殊字符的字段 const productId = partInfo['ICECAT-interface'].Product['@ID']; const supplierName = partInfo['ICECAT-interface'].Product.Supplier['@Name']; // 输出CSV行 print(`${jsonObject.part_no},${productId},${supplierName}`); }
写法说明
- JavaScript对象属性访问分两种:
.标识符仅适用于合法标识符(无特殊字符、不以数字/特殊符号开头);当字段含连字符、@等特殊字符时,必须用['字符串']形式。 part_number_info是数组类型,必须通过索引(如[0])取出具体元素后,才能访问其内部属性。
内容的提问来源于stack exchange,提问作者Matias
相关产品推荐
相关产品推荐

