猫鼬:更新嵌套文档

时间:2018-07-19 09:29:55

标签: mongodb mongoose

我具有以下JSON结构,

{
  "projectId": "service-request-service",
  "projectVersion": [{
    "version":"1",
    "localConfig": [{
      "port": "3003",
      "mongoURI": "mongodb://localhost:27017/serviceRequest",
      "MQ": "RMQ",
      "logLevel": "2",
      "version": "1.1",
      "created": "03-06-2018 03:11:00 PM",
      "active": "N"
    },
    {
      "port": "3004",
      "mongoURI": "mongodb://localhost:27017/serviceRequest",
      "MQ": "IMQ",
      "logLevel": "1",
      "version": "1.2",
      "created": "07-06-2018 03:11:00 PM",
      "active": "Y"
    }]
  }]
}

现在,我想更新port的所有activelocalConfig值。我尝试使用不同的方式,

  1. 使用markModified

    ProjectConfig.findOne({'projectId' : projectId,
        'projectVersion.version' : version})
        .exec(function(err,pc){
    
    pc.projectVersion[0].localConfig[0].active = "N";
    pc.projectVersion[0].localConfig[0].port = "5555";
    
    pc.markModified('localConfig');
    
    pc.save(function(err,result){
        if (err) {
            console.log(err);
        }
        console.log("## SUCCESSFULLY SAVED  ");
    });
    
    });
    
  2. 使用for循环进行迭代。

     ProjectConfig.findOne({'projectId' : projectId,
    'projectVersion.version' : version}).exec(function(err,pc){
    
    for(i = 0; i < pc.projectVersion.length ; i++){                    
        for(j = 0; j < pc.projectVersion[i][envQuery].length ; j++){ 
            pc.projectVersion[i][envQuery][j].active = 'N';
            pc.projectVersion[i][envQuery][j].port = '5555';
        }
    }
    
    pc.save(function (err, result) {
        if (err) {
            console.log(err);
        }
        console.log("## SUCCESSFULLY SAVED  ");
    });        
    });
    
  3. 使用arrayFilters

    let conditions = {};
    let update = {$set: {"projectVersion.$[i].localConfig.$[].port": "5555"}};
    let options = {arrayFilters:[{"i.version":"1"}]};
    pc.update(conditions,update,options,function(err,result){
        if (err) {
            console.log(err);
        }
        console.log("## SUCCESSFULLY SAVED  ");
    });
    

但是,我遇到了错误。

MongooseError: Callback must be a function, got [object Object]

请提供给我更新文档的方法。

MongoDB : v3.6.6Mongoose : ^5.0.14的当前版本

1 个答案:

答案 0 :(得分:0)

我使用arrayFilters不在方案上应用update方法,而是在find方法的对象返回上应用。 当我在架构上直接应用update方法时,它就起作用了。

let conditions = { "projectId" : "32804-service-request-service" };
            let update = { $set: {
                                "projectVersion.$[i].localConfig.$[j].port" : "5555",
                                }
                        };
            let options = {arrayFilters:[{"i.version":"1" },{ "j.port" : "3003"}]};
            ProjectConfig.update(conditions, update, options, function(err,result){
                if (err) {
                    return res.status(500).json({
                        title: 'An error occurred',
                        error: err
                    });
                }
                res.status(200).json({
                    message: 'SUCCESS',
                    obj: result  
                });
            });
相关问题