MongoDB:重命名嵌套文档中数组中的字段。

huangapple go评论59阅读模式
英文:

MongoDB: Rename field in array with nested document

问题

NUTZERKENNUNGAUFTRAGGEBER 必须更名为 ORDNUNGSBEGRIFFAUFTRAGGEBER。

所以,结果应该如下所示:

[
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1082"
          },
          "ANYTHING": "bla",
          "BLUBB": "bla"
        }
      }
    ]
  },
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1083"
          }
        }
      }
    ]
  },
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1084"
          }
        }
      }
    ]
  }
]

尝试了以下代码,但没有成功。问题在于 parserErgebnis.values.ORDNUNGSBEGRIFFAUFTRAGGEBER 报错。有效的方式是只使用 ORDNUNGSBEGRIFFAUFTRAGGEBER,但那会导致 values 子文档消失。

db.collection.update({
  "parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER": {
    $exists: true
  }
},
[
  {
    $addFields: {
      parserErgebnis: {
        $map: {
          input: "$parserErgebnis",
          as: "parserErgebnis",
          in: {
            "parserErgebnis.values.ORDNUNGSBEGRIFFAUFTRAGGEBER": "$$parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER"
          }
        }
      }
    }
  }
],
{
  multi: true
})

有什么想法吗?感谢您的帮助。

英文:

I struggle to rename a fieldname within a nested document in an array in MongoDB:

[
  {
    "parserErgebnis": [
      {
        "values": {
          "NUTZERKENNUNGAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1082"
          },
          "ANYTHING": "bla",
          "BLUBB": "bla"
        }
      }
    ]
  },
  {
    "parserErgebnis": [
      {
        "values": {
          "NUTZERKENNUNGAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1083"
          }
        }
      }
    ]
  },
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1084"
          }
        }
      }
    ]
  }
]

NUTZERKENNUNGAUFTRAGGEBER must be renamed to ORDNUNGSBEGRIFFAUFTRAGGEBER.

So, the result should look like that:

[
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1082"
          },
          "ANYTHING": "bla",
          "BLUBB": "bla"
        }
      }
    ]
  },
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1083"
          }
        }
      }
    ]
  },
  {
    "parserErgebnis": [
      {
        "values": {
          "ORDNUNGSBEGRIFFAUFTRAGGEBER": {
            "status": "OK",
            "wert": "1000/13138/1084"
          }
        }
      }
    ]
  }
]

I tried this which doesn't work. The problem is that parserErgebnis.values.ORDNUNGSBEGRIFFAUFTRAGGEBER is throwing an error. What works is just ORDNUNGSBEGRIFFAUFTRAGGEBER, but with that values sub-document is gone.

db.collection.update({
  "parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER": {
    $exists: true
  }
},
[
  {
    $addFields: {
      parserErgebnis: {
        $map: {
          input: "$parserErgebnis",
          as: "parserErgebnis",
          in: {
            "parserErgebnis.values.ORDNUNGSBEGRIFFAUFTRAGGEBER": "$$parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER"
          }
        }
      }
    }
  }
],
{
  multi: true
})

Any ideas? I appreciate your help.
https://mongoplayground.net/p/N6pjj8J_Vme

答案1

得分: 1

Try this:

db.collection.update(
  {
    "parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER": {
      $exists: true
    }
  },
  [
    {
      $addFields: {
        parserErgebnis: {
          $map: {
            input: "$parserErgebnis",
            as: "parserErgebnis",
            in: {
              "values": {
                ORDNUNGSBEGRIFFAUFTRAGGEBER: "$$parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER"
              }
            }
          }
        }
      }
    }
  ],
  {
    multi: true
  }
)

Update:

A generic solution would be this one:

db.collection.aggregate([
  {
    $match: {
      "parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER": { $exists: true }
    }
  },
  {
    $set: {
      "parserErgebnis.values": {
        $map: {
          input: "$parserErgebnis.values",
          in: { $objectToArray: "$$this" }
        }
      }
    }
  },
  {
    $set: {
      parserErgebnis: {
        $map: {
          input: "$parserErgebnis",
          as: "parserErgebnis",
          in: {
            values: {
              $map: {
                input: "$$parserErgebnis.values",
                as: "value",
                in: {
                  $concatArrays: [
                    {
                      $filter: {
                        input: "$$value",
                        cond: { $ne: ["$$this.k", "NUTZERKENNUNGAUFTRAGGEBER"] }
                      }
                    },
                    [
                      {
                        k: "ORDNUNGSBEGRIFFAUFTRAGGEBER",
                        v: {
                          $let: {
                            vars: {
                              val: {
                                $filter: {
                                  input: "$$value",
                                  cond: { $eq: ["$$this.k", "NUTZERKENNUNGAUFTRAGGEBER"] }
                                }
                              }
                            },
                            in: { $first: "$$val.v" }
                          }
                        }
                      }
                    ]
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $set: {
      "parserErgebnis": {
        $map: {
          input: "$parserErgebnis",
          as: "parserErgebnis",
          in: {
            values: {
              $first: {
                $map: {
                  input: "$$parserErgebnis.values",
                  as: "value",
                  in: { $arrayToObject: "$$value" }
                }
              }
            }
          }
        }
      }
    }
  }
])

Mongo Playground

英文:

Try this:

db.collection.update({
"parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER": {
$exists: true
}
},
[
{
$addFields: {
parserErgebnis: {
$map: {
input: "$parserErgebnis",
as: "parserErgebnis",
in: {
"values": {
ORDNUNGSBEGRIFFAUFTRAGGEBER: "$$parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER"
}
}
}
}
}
}
],
{
multi: true
})

Mongo Playground

Update

A generic solution would be this one:

db.collection.aggregate([
{
$match: {
"parserErgebnis.values.NUTZERKENNUNGAUFTRAGGEBER": { $exists: true }
}
},
{
$set: {
"parserErgebnis.values": {
$map: {
input: "$parserErgebnis.values",
in: { $objectToArray: "$$this" }
}
}
}
},
{
$set: {
parserErgebnis: {
$map: {
input: "$parserErgebnis",
as: "parserErgebnis",
in: {
values: {
$map: {
input: "$$parserErgebnis.values",
as: "value",
in: {
$concatArrays: [
{
$filter: {
input: "$$value",
cond: { $ne: ["$$this.k", "NUTZERKENNUNGAUFTRAGGEBER"] }
}
},
[{
k: "ORDNUNGSBEGRIFFAUFTRAGGEBER",
v: {
$let: {
vars: {
val: {
$filter: {
input: "$$value",
cond: { $eq: ["$$this.k", "NUTZERKENNUNGAUFTRAGGEBER"] }
}
}
},
in: { $first: "$$val.v" }
}
}
}]
]
}
}
}
}
}
}
}
},
{
$set: {
"parserErgebnis": {
$map: {
input: "$parserErgebnis",
as: "parserErgebnis",
in: {
values: {
$first: {
$map: {
input: "$$parserErgebnis.values",
as: "value",
in: { $arrayToObject: "$$value" }
}
}
}
}
}
}
}
}
])

huangapple
  • 本文由 发表于 2023年4月13日 23:17:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/76007136.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定