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

MongoDB文档嵌套数组更新:ObjectId数组转字符串数组

问题:将MongoDB嵌套数组中的ObjectId转换为字符串数组

原始数据

{
    "_id" : ObjectId("5d7e6c54c23c210001108556"),
    "parentId" : "5d0162ba69cf130001a16115",
    "tasks" : [
        {
            "_id" : "ae60a8f1",
            "taskMetaDataIds" : [
                ObjectId("5d55a648e2f7320001e578ac")
            ],
            "name" : "meta 3"
        },
        {
            "_id" : "07544d96",
            "taskMetaDataIds" : [
                 ObjectId("5d55a648e2f732676676676"),
                 ObjectId("5d55a648e2612333556888")
            ],
            "name" : "meta 2"
        }
    ],
    "name" : "New Topic",
    "createdBy" : "01526151-8303-450f-b08b-b36a1760b774",
    "createdDate" : ISODate("2019-09-15T16:52:36.150+0000"),
    "updatedDate" : ISODate("2019-09-15T16:52:36.150+0000")
}

期望输出

{
    "_id" : ObjectId("5d7e6c54c23c210001108556"),
    "parentId" : "5d0162ba69cf130001a16115",
    "tasks" : [
        {
            "_id" : "ae60a8f1",
            "taskMetaDataIds" : [
                "5d55a648e2f7320001e578ac"
            ],
            "name" : "meta 3"
        },
        {
            "_id" : "07544d96",
            "taskMetaDataIds" : [
                "5d55a648e2f732676676676",
                "5d55a648e2612333556888"
            ],
            "name" : "meta 2"
        }
    ],
    "name" : "New Topic",
    "createdBy" : "01526151-8303-450f-b08b-b36a1760b774",
    "createdDate" : ISODate("2019-09-15T16:52:36.150+0000"),
    "updatedDate" : ISODate("2019-09-15T16:52:36.150+0000")
}

无效尝试

db.getCollection("data").updateOne({"_id":ObjectId("5d7e6c54c23c210001108556")}, [{ $set: { "tasks.taskMetaDataIds": "$tasks.taskMetaDataIds.str" } }])

解决方案

使用MongoDB聚合管道的$map操作符遍历嵌套数组,结合$toString将ObjectId转换为字符串,完整更新语句如下:

db.getCollection("data").updateOne(
  {"_id": ObjectId("5d7e6c54c23c210001108556")},
  [
    {
      $set: {
        tasks: {
          $map: {
            input: "$tasks",
            as: "task",
            in: {
              _id: "$$task._id",
              name: "$$task.name",
              taskMetaDataIds: {
                $map: {
                  input: "$$task.taskMetaDataIds",
                  as: "metaId",
                  in: {$toString: "$$metaId"}
                }
              }
            }
          }
        }
      }
    }
  ]
)

说明

  • 外层$map遍历tasks数组,对每个任务对象重新构造内容
  • 内层$map遍历每个任务的taskMetaDataIds数组,用$toString将每个ObjectId转换为对应的字符串形式
  • 该方案基于MongoDB 4.2+版本支持的聚合管道更新语法,可直接通过原生操作符完成转换,无需脚本循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:41:00