You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB文档转换:将media数组转为含media_info与num_images的对象

如何将MongoDB中的数组类型字段转换为包含子数组和长度字段的对象类型?

需求说明

原文档结构:

{
   "id" : 123,
   "source" : "abc",
   "media" : [ 
        {
            "index_num" : 0,
            "media_url" : "some url"
        }, 
        {
            "index_num" : 1,
            "media_url" : "some url"
        }, 
        {
            "index_num" : 2,
            "media_url" : "some url"
        }
    ]
}

需要将media数组转换为对象类型,新增num_images字段(值为子数组长度),转换后结构:

{
    "id" : 123,
    "source" : "abc",
    "media" : { 
        "media_info" : [ 
         {
             "index_num" : 0,
             "media_url" : "some url"
         }, 
         {
             "index_num" : 1,
             "media_url" : "some url"
         }, 
         {
             "index_num" : 2,
             "media_url" : "some url"
         }
       ],
       "num_images" : 3
     }
 }

查询时转换(不修改原数据)

使用聚合管道的$addFields阶段覆盖原media字段,直接构造目标对象:

db.collection.aggregate([
  {
    $addFields: {
      media: {
        media_info: "$media",
        num_images: { $size: "$media" }
      }
    }
  }
])

永久修改集合中的文档(MongoDB 4.2+)

如果需要把所有文档的结构都更新成目标格式,用updateMany配合聚合管道:

db.collection.updateMany(
  {}, // 匹配所有文档,可根据需求添加过滤条件
  [
    {
      $set: {
        media: {
          media_info: "$media",
          num_images: { $size: "$media" }
        }
      }
    }
  ]
)

关键操作符说明

  • $addFields/$set:用于添加或覆盖字段,这里用来重新定义media字段的结构
  • $size:返回数组的长度,直接作用于原media数组就能得到num_images的值

内容的提问来源于stack exchange,提问作者Abhinay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:20:30