如何重命名MongoDB中对象数组中的嵌套键?

如何重命名MongoDB中对象数组中的嵌套键?,mongodb,mongodb-query,Mongodb,Mongodb Query,文件结构 { _id: 5, grades: [ { grade_ : 80, mean: 75, std: 8 }, { mean: 90, std: 5 }, { mean: 85, std: 3 } ] } 根据mongodb中的上述文档结构,我想将key grade_uu重命名为grade db.collection.update({"_id":5},{"$rename":{"grades.grade_":"grades.grade"}},{"

文件结构

{
  _id: 5,
  grades: [
     { grade_ : 80, mean: 75, std: 8 },
     { mean: 90, std: 5 },
     { mean: 85, std: 3 }
  ]
}
根据mongodb中的上述文档结构,我想将key grade_uu重命名为grade

db.collection.update({"_id":5},{"$rename":{"grades.grade_":"grades.grade"}},{"upsert":false,"multi":true})
下面给出了一个错误

"writeError" : {
        "code" : 28,
        "errmsg" : "cannot use the part (grades of grades.grade_) to traverse the element ({grades: [ { grade_: 80.0, mean: 75.0, std: 8.0 }, { mean: 90.0, std: 5.0 }, { mean: 85.0, std: 3.0 } ]})"
    }
我想将关键等级重命名为等级,预期输出

{
  _id: 5,
  grades: [
     { grade : 80, mean: 75, std: 8 },
     { mean: 90, std: 5 },
     { mean: 85, std: 3 }
  ]
}

根据MongoDB文档:(
$rename
如果这些字段位于数组元素中,则不起作用。

对于嵌入文档中的字段,$rename操作符可以重命名这些字段,也可以将字段移入和移出嵌入文档$如果这些字段位于数组元素中,则重命名不起作用

因此,您需要编写自定义逻辑以进行更新

db.collection.find({
  "grades. grade_": { $exists : 1 }
}).forEach( function( doc ) {
  for( i=0; i < doc.grades.length; i++ ) {
    if(doc.grades[i].grade_ != undefined) {
      doc.grades[i].grade = doc.grades[i].grade_;
      delete doc.grades[i].grade_;
    }
  }
  db.collection.update({ _id : doc._id }, doc);
});
db.collection.find({
“grades.grade_u2;”:{$exists:1}
}).forEach(功能(文档){

对于(i=0;i根据MongoDB文档:(
$rename
如果这些字段位于数组元素中,则不起作用。

对于嵌入文档中的字段,$rename运算符可以重命名这些字段,也可以将字段移入和移出嵌入文档。如果这些字段位于数组元素中,$rename不起作用

因此,您需要编写自定义逻辑以进行更新

db.collection.find({
  "grades. grade_": { $exists : 1 }
}).forEach( function( doc ) {
  for( i=0; i < doc.grades.length; i++ ) {
    if(doc.grades[i].grade_ != undefined) {
      doc.grades[i].grade = doc.grades[i].grade_;
      delete doc.grades[i].grade_;
    }
  }
  db.collection.update({ _id : doc._id }, doc);
});
db.collection.find({
“grades.grade_u2;”:{$exists:1}
}).forEach(功能(文档){

对于(i=0;i
$rename
在数组中不起作用。因此,您可以使用聚合框架的
$addField
重命名数组中的字段

db.collection.aggregate([
  {
    $addFields: {
      grades: {
        $map: {
          input: "$grades",
          as: "grade",
          in: {
            grade: "$$grade.grade_",
            mean: "$$grade.mean",
            std: "$$grade.std"
          }
        }
      }
    }
  }
])
输出:

[
  {
    "_id": 5,
    "grades": [
      {"grade": 80,"mean": 75,"std": 8},
      {"mean": 90,"std": 5},
      {"mean": 85,"std": 3}
    ]
  }
]

$rename
在数组中不起作用。因此,您可以使用聚合框架的
$addField
重命名数组中的字段

db.collection.aggregate([
  {
    $addFields: {
      grades: {
        $map: {
          input: "$grades",
          as: "grade",
          in: {
            grade: "$$grade.grade_",
            mean: "$$grade.mean",
            std: "$$grade.std"
          }
        }
      }
    }
  }
])
输出:

[
  {
    "_id": 5,
    "grades": [
      {"grade": 80,"mean": 75,"std": 8},
      {"mean": 90,"std": 5},
      {"mean": 85,"std": 3}
    ]
  }
]

如果您想自己测试它,请点击链接并运行它。此解决方案不适用于我,因为它需要在$map.in对象中添加所有可能的键。在我的情况下,可能有400多个键keys@MilanRegmi我正在尝试做类似的聚合,但遇到了一些问题。如果你愿意,你能帮我点击链接并运行它吗自己测试一下。这个解决方案对我不起作用,因为它需要在$map.in对象中添加所有可能的键。在我的情况下,可能会有400多个键keys@MilanRegmi我正在尝试做类似的聚合,但遇到了一些问题。你能在这里帮助我吗