mongoose 更新mongo文档中的嵌套数组

fv2wmkja  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(236)

我下面有收藏

{
    "_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")
}

我正在寻找下面的输出。是否有一个操作符可以直接将对象数组转换为字符串数组,如下所示。我可以通过在taskMetaDataIds数组上循环的脚本来完成,但我希望使用一个适合我目的的直接mongo操作符。

{
    "_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" } }])

fkaflof6

fkaflof61#

  1. $set-设置tasks数组字段。
    1.1. $map-迭代tasks数组中的每个元素并返回一个新数组。
    1.1.1. $mergeObjects-合并当前迭代的task对象和taskMetaDataIds数组(来自结果 1.1.1.1)。
    1.1.1.1. $map-迭代当前已迭代的task对象的taskMetaDataIds数组,并返回一个新数组。
    1.1.1.1.1. $toString-将每个迭代ID从ObjectId类型转换为string类型。
db.getCollection("data").updateOne({
  "_id": ObjectId("5d7e6c54c23c210001108556")
},
[
  {
    $set: {
      "tasks": {
        $map: {
          input: "$tasks",
          as: "task",
          in: {
            $mergeObjects: [
              "$$task",
              {
                "taskMetaDataIds": {
                  $map: {
                    input: "$$task.taskMetaDataIds",
                    in: {
                      $toString: "$$this"
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Demo @ Mongo Playground

相关问题