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
相关产品推荐
相关产品推荐

