如何通过MongoDB查询将键值形式单对象字段转换为对象数组
可直接通过MongoDB原生聚合能力完成该结构转换
完全不需要依赖外部脚本做离线数据处理,用内置的聚合操作符就能实现和示例完全一致的输出效果。
实现逻辑
- 第一步调用内置的
$objectToArray,把原本存成单对象的fields字段直接拆成临时数组,拆完的每个元素天生就是k(存原对象的键名)、v(存原对象的键值)的结构,和目标结构只差字段命名 - 第二步用
$map遍历这个拆好的临时数组,把每个元素的k映射为name、v映射为value,即可完全匹配预期的输出结构
可直接运行的聚合语句
db.your_collection.aggregate([ { $set: { fields: { $map: { input: { $objectToArray: "$fields" }, in: { name: "$$this.k", value: "$$this.v" } } } } } ])
补充说明
- 这套写法从MongoDB 3.4版本开始完全兼容,不存在版本适配问题
- 转换全程保留原字段值的原生数据类型,不会把数字、布尔值这类类型强行转成字符串,输出结构和示例要求完全对齐
- 如果需要把转换结果永久更新回原文档,不需要手动逐条编写更新语句,只要在聚合管道末尾追加
$merge阶段,把聚合输出回写到当前集合即可 - 哪怕是嵌套层级更深的键值对对象,只要调整
$objectToArray指向的字段路径,就能直接复用这套转换逻辑
内容的提问来源于stack exchange,提问作者Cesar Augusto
相关产品推荐
相关产品推荐

