【问题标题】:Updating object in double nested array in MongoDB [duplicate]在MongoDB中更新双嵌套数组中的对象[重复]
【发布时间】:2018-04-21 13:56:40
【问题描述】:

我有一个学生对象的集合,我在 MongoDB 集合中有这个学生文档,并且想要更新属于这个学生所拥有的课程之一的老师。例如,我想更新属于数据库课程的 Danny 的名称。

{
    "firstName": "John",
    "lastName": "Wayne",
    "age": 25,
    "bbId": "johx0055",
    "courses" : [
        {
            "name" : "Web development",
            "teachers" : [
                {
                    "firstName" : "Bob",
                    "lastName" : "Birch"
                }
            ]
        },
        {
            "name" : "Interface Design",
            "teachers" : [
                {
                    "firstName" : "Roxanna",
                    "lastName" : "Doe"
                }
            ]
        },
        {
            "name" : "Databases",
            "teachers" : [
                {
                    "firstName" : "Jack",
                    "lastName" : "X"
                },
                {
                    "firstName" : "Danny",
                    "lastName" : "Doe"
                }
            ]
        }
    ]
}

我正在尝试在 nodejs 环境中更新它。我尝试了这个查询,这是我最接近正确解决方案的地方:

 db.collection('students').update({ 'bbId' : johx0055, 'courses.name' : 'Databases', 'courses.teachers.firstName' : 'Danny'}, { $set : { 'courses.$.teachers.0.firstName' : 'X' }}, (err, result) => {
    if (err) {
        console.log(err);
        //console.log({ "status": "error", "type": "001 -> create student", "message": "Error when updating teacher" });
        return;
    }
    console.log({ "status": "OK", "message": "Successfully updated teacher" });
})

但是,如 0 所示,只更新教师数组中的第一个元素(Jack)

【问题讨论】:

  • 你的索引值是哪些键?

标签: javascript arrays node.js mongodb mongodb-query


【解决方案1】:

首先,一定要问自己 mongodb 是否是适合您的存储解决方案。该数据看起来具有高度相关性(您真的想在每次课程更改时更新每个学生吗?)

话虽如此,我认为最好的方法是用您想要的新文档覆盖整个文档。

var new_doc = {...}
db.save(new_doc)

【讨论】:

  • 这是我们必须使用 MongoDB 的作业的一部分,以便我们可以学习查询 MongoDB 数据库。 db.save(new_doc) 会覆盖现有对象吗?
  • mongodb 中的每个文档都有一个索引键,当您保存新文档时,它会查找该索引键并且:如果不存在:保存新文档如果存在:更新文档有它。如果我不得不猜测,我会猜测 bbId 是这个数据库中的索引键。但您可以使用collection.indexInformation() 进行检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2017-09-11
  • 2019-12-07
  • 2018-04-26
  • 2018-11-07
相关资源
最近更新 更多