mongodb第三级嵌套数组修改问题

新手上路,请多包涵

现在的数据结构是这样的

course:{
    name:String,
    chapter: [{ 
            name: String,
            knowledge: [{ 
                name: String,
                exam: [{ 
                    name: String, 
                }]
            }]
        }]
}

要想修改knowledge.name,修改语句该怎么写?之前在修改chapter.name时我是这样写的

Course.update({
                "chapter._id": req.body.id
            }, {
                $set: {
                    "chapter.$.name": name, //名称
                }
            })
            .exec(function(err, num) {


            });

不知道在修改第三级嵌套文档时,$定位符改怎么使用。

阅读 13.3k
2 个回答

其实想复杂了,嵌套查询嵌套修改什么的,如果一层一层的去找节点,效率不怎么高的。
文档型数据库,说白了,不多嵌套都深,总是一串类json格式的字符串。
最快最直接的方式如下:

jsondb.term.update({"_id" : ObjectId("54c1a899eb21ac9c995d3eb2")}, {$set:{
    "_id" : ObjectId("54c1a899eb21ac9c995d3eb2"),
    "course" : {
        "name" : "String",
        "chapter" : [ 
            {
                "name" : "String",
                "knowledge" : [ 
                    {
                        "name" : "原来如此",
                        "exam" : [ 
                            {
                                "name" : "String"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}})

你程序保证不变就好。先find出结果,只修改knowledge的name,然后再update。
对数据库任何操作觉得很别扭很麻烦很低效的时候,就应该回过头想想数据库的结构设计是不是可以改进,这一点对于关系型数据库或非关系型数据库都适用。http://www.cnblogs.com/mokafamily/p/4102829.html,可以看看这篇文章中的“1.范式化与反范式化”这一节

// 插入 demo 数据
db.demo.insert({
    "panels": [
        {
            "id": 10000,
            "condition": [
                {
                    "valueConnection": "changed",
                    "valueSource": 111
                },
                {
                    "valueConnection": "nochanged",
                    "valueSource": 122
                },
                {
                    "valueConnection": "nochanged",
                    "valueSource": 133
                },
                {
                    "valueConnection": "changed",
                    "valueSource": 144
                }
            ]
        },
        {
            "id": 20000,
            "condition": [
                {
                    "valueConnection": "changed",
                    "valueSource": 211
                },
                {
                    "valueConnection": "nochanged",
                    "valueSource": 222
                },
                {
                    "valueConnection": "nochanged",
                    "valueSource": 233
                }
            ]
        }
    ]
})

// 执行更新操作
db.demo.update({}, {
    $inc: {
        "panels.$[t].condition.$[val].valueSource": 100001
    }
}, {
    arrayFilters: [{
        "t.id": 10000
    }, {
        "val.valueConnection": "changed"
    }],
    multi: true
});

3.6已经支持多层嵌套数组的修改了,请看这篇文章
https://segmentfault.com/q/10...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进