英文:
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" }
}
}
}
}
}
}
}
}
])
英文:
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" }
}
}
}
}
}
}
}
}
])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论