在不重构Mongo数据库的情况下,更新嵌入数组中的具有给定ID的对象

Update object with given ID embed in array without restructuring Mongo database

本文关键字:数组 对象 ID Mongo 重构 数据库 情况下 更新      更新时间:2023-09-26

我得到了以下名为"client"的文档,其中包括id、名称和项目列表(对象数组):

{
    "_id": {
        "$oid": "572225d997bb651819f379f7"
    },
    "name": "ppg",
    "projects": [
        {
            "name": "aaa",
            "job_description": "",
            "projectID": 20
        },
        {
            "name": "bbbb",
            "job_description": "",
            "projectID": 21
        }
    ]
}

我想用给定的"项目ID"更新项目的"jobdescription",如下所示:

module.exports.saveJobDesc = function(client, idOfProject, textProvided) {
    db.clients.update({ name: client}, 
    { $set: {'projects.0.job_description': textProvided }});
};

但是,我希望使用"projectID"查找特定项目,而不是数组的硬编码索引"0"。有没有一种方法可以在不改变集合和/或文档结构的情况下实现这一点?

如果您想更新name="ppg"且project_id=20的"jobdescription",则可以使用以下mongo查询:-

db.clients.update({ "name":"ppg","projects.projectID":20 },{$set: {"projects.$.job_description": "abcd"}})

请告诉我是否需要其他东西

您不能在一次更新操作中更新多个数组元素,而是可以逐个更新,这需要时间,具体取决于数组中元素的数量和集合中此类文档的数量。请参阅"新建"操作符以更新数组中的所有匹配项

   db.test2.find().forEach( function(doc) {
    var projects = doc.projects;
    for(var i=0;i<projects.length;i++){
        var project = projects[i];
        if(project.projectID == 20){
            var field = "projects."+i+".job_description";
            var query = {};
            query[field] = "textasdsd";
            db.test2.update({ _id: doc._id},{ $set:query});
        }
}
})