首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MongoDB中的对象数组中重命名嵌套键?

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

Stack Overflow用户
提问于 2019-07-30 08:54:47
回答 2查看 2.2K关注 0票数 2

文档结构

代码语言:javascript
复制
{
  _id: 5,
  grades: [
     { grade_ : 80, mean: 75, std: 8 },
     { mean: 90, std: 5 },
     { mean: 85, std: 3 }
  ]
}

根据上述mongodb中的文档结构,我希望将键grade_重命名为

代码语言:javascript
复制
db.collection.update({"_id":5},{"$rename":{"grades.grade_":"grades.grade"}},{"upsert":false,"multi":true})

给出了以下错误

代码语言:javascript
复制
"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 } ]})"
    }

我想将键grade_重命名为分级,期望输出

代码语言:javascript
复制
{
  _id: 5,
  grades: [
     { grade : 80, mean: 75, std: 8 },
     { mean: 90, std: 5 },
     { mean: 85, std: 3 }
  ]
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-30 09:14:23

根据($rename文档:如果这些字段位于数组元素.中,则无法工作)

对于嵌入文档中的字段,$rename操作符可以重命名这些字段,也可以将字段在嵌入文档中移动或移出嵌入文档。如果这些字段位于数组元素中,则$rename无法工作。

因此,您需要编写您的自定义逻辑来更新。

代码语言:javascript
复制
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);
});
票数 4
EN

Stack Overflow用户

发布于 2019-07-30 09:56:47

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

代码语言:javascript
复制
db.collection.aggregate([
  {
    $addFields: {
      grades: {
        $map: {
          input: "$grades",
          as: "grade",
          in: {
            grade: "$$grade.grade_",
            mean: "$$grade.mean",
            std: "$$grade.std"
          }
        }
      }
    }
  }
])

输出:

代码语言:javascript
复制
[
  {
    "_id": 5,
    "grades": [
      {"grade": 80,"mean": 75,"std": 8},
      {"mean": 90,"std": 5},
      {"mean": 85,"std": 3}
    ]
  }
]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57267848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档