如何将集合中多字符串字段拆分转换为单字段独立文档
拆分集合文档的u1/u2字段为独立的user文档
原集合结构
[ { u1: 'xx', u2: 'gg' }, { u1: 'yy', u2: 'Nk' }, { u1: 'zz', u2: 'hh' }, { u1: 'ya', u2: 'hj' }, { u1: 'ab', u2: 'jd' }, ]
目标结构
[ {user: 'xx'}, {user: 'gg'}, {user: 'yy'}, {user: 'Nk'}, {user: 'zz'}, {user: 'hh'}, {user: 'ya'}, {user: 'hj'}, {user: 'ab'}, {user: 'jd'}, ]
方案一:MongoDB聚合管道实现
如果是在MongoDB中处理集合数据,可通过聚合管道完成转换:
db.collection.aggregate([ // 将u1、u2值组合为数组 { $project: { users: ['$u1', '$u2'] } }, // 拆分数组为独立文档 { $unwind: '$users' }, // 重命名字段为目标结构 { $replaceRoot: { newRoot: { user: '$users' } } }, // 可选:移除原文档的_id字段 { $project: { _id: 0 } } ])
步骤说明
$project:把每个文档的u1、u2值打包成users数组,原文档转为{ _id: ObjectId(...), users: ['xx', 'gg'] }格式。$unwind:将数组中的每个元素拆分为独立文档,此时每个文档为{ _id: ObjectId(...), users: 'xx' }。$replaceRoot:将users字段的值作为新文档的user字段,替换根结构。- 可选的
$project:移除原文档的_id,让结果完全匹配示例格式。
方案二:JavaScript数组处理
如果是在代码中处理内存中的数组数据,用flatMap可快速实现:
const originalData = [ { u1: 'xx', u2: 'gg' }, { u1: 'yy', u2: 'Nk' }, { u1: 'zz', u2: 'hh' }, { u1: 'ya', u2: 'hj' }, { u1: 'ab', u2: 'jd' }, ]; const result = originalData.flatMap(item => [ { user: item.u1 }, { user: item.u2 } ]); console.log(result);
说明
flatMap遍历原数组的每个对象,返回包含两个user对象的子数组,同时自动将所有子数组合并为一个一维数组,直接得到目标结构。
内容的提问来源于stack exchange,提问作者Rahul Kumar
相关产品推荐
相关产品推荐

