如何映射和合并数组的数组的对象

how to map and mergeObjects of an array of an array

我想应用 mergeObjects 和数组的数组映射:

当我是Array in的一级时,我能够完成映射和合并,但是如果Array有另一个数组,我不确定如何应用另一个map/merge对象。

{
_id: "123",
date: "1900-01-01T11:00:00.0000000",
name: "joe",
birthdayservice: [
 {
    "date": "1999-01-01",
    "team" : [ 
       {
          "requestedDate": "1999-01-01"
       },
       {
          "requestedDate": "1999-05-01"
       }
  },
  {
    "date": "1998-01-01",
    "team" : [ 
       {
          "requestedDate": "1999-01-01"
       },
       {
          "requestedDate": "1999-05-01"
       }
  }
]
}

我能够通过 birthdayservice 中的第一个数组进行映射,将日期转换为 ISO_Date/todate,例如:

{
    "$addFields": {
    "birthdayservice": {
        $map: {
            input: "$birthdayservice", //this is an array
            in: {
            "$mergeObjects": [
                "$$this",
                    {
                        "date": {
                        "$toDate": "$$this.date"
                        }
                    }
                ]}
            }
        }
    }
 
}

但是当我进入更多的嵌套值时,我得到

$mergeObjects requires object inputs, but input is an array

{
    "$addFields": {
    "birthdayservice": {
        $map: {
            input: "$birthdayservice", //this is an array
            in: {
            "$mergeObjects": [
                "$$this",
                    {
                        "date": {
                        "$toDate": "$$this.date"
                        }
                    }
                ]}
            }
        }
    }
 
},
{
    "$addFields": {
    "birthdayservice": {
        $map: {
            input: "$birthdayservice.team", //also an array
            in: {
            "$mergeObjects": [
                "$$this",
                    {
                        "requestedDate": {
                        "$toDate": "$$this.requestedDate"
                        }
                    }
                ]}
            }
        }
    }
}

我的最终目标是将日期字符串字段重新设置为日期转换

birthdayservice.date birthdayservice.team.requestedDate

两者都 ISO_Dates 如下:

{
_id: "123",
date: "1900-01-01T11:00:00.0000000",
name: "joe",
birthdayservice: [
 {
    "date": ISO_Date("1999-01-01T11:00:00.0000000Z"),
    "team" : [ 
       {
          "requestedDate": ISO_Date("1999-01-01T11:00:00.0000000Z")
       },
       {
          "requestedDate": ISO_Date("1999-05-01T11:00:00.0000000Z")
       }
  },
  {
    "date": "1998-01-01",
    "team" : [ 
       {
          "requestedDate": ISO_Date("1999-01-01T11:00:00.0000000Z")
       },
       {
          "requestedDate": ISO_Date("1999-05-01T11:00:00.0000000Z")
       }
  }
]
}

查询

  • 这会将所有日期字符串转换为 birthdayserviceteams 数组中的日期
  • 地图birthdayservice
  • 转换 "date"
  • 嵌套映射以转换 team
  • 中的日期
  • 字段更改值的方式是 mergeObjects (在 mongodb5 中我们也有 setField 来做这个)

Test code here

aggregate(
[{"$set":
  {"birthdayservice":
   {"$map":
    {"input":"$birthdayservice",
     "in":
     {"$mergeObjects":
      ["$$bs",
       {"date":{"$toDate":"$$bs.date"},
        "team":
        {"$map":
         {"input":"$$bs.team",
          "in":
          {"$mergeObjects":
           ["$$t", {"requestedDate":
                    {"$toDate":"$$t.requestedDate"}}]},
          "as":"t"}}}]},
     "as":"bs"}}}}])