Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoose:更新嵌套文档_Mongodb_Mongoose - Fatal编程技术网

Mongodb Mongoose:更新嵌套文档

Mongodb Mongoose:更新嵌套文档,mongodb,mongoose,Mongodb,Mongoose,我有以下JSON结构 { "projectId": "service-request-service", "projectVersion": [{ "version":"1", "localConfig": [{ "port": "3003", "mongoURI": "mongodb://localhost:27017/serviceRequest", "MQ": "RMQ", "logLevel": "2",

我有以下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"
    }]
  }]
}
现在,我想更新
localConfig
的所有
port
active
值。我试着用不同的方法

  • 使用
    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  ");
    });
    
    });
    
  • 对循环使用
    进行迭代

     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  ");
    });        
    });
    
  • 但是,我得到下面的错误

    MongooseError: Callback must be a function, got [object Object]
    
    请提供我更新文档的方法


    当前版本的
    MongoDB:v3.6.6
    Mongoose:^5.0.14
    使用
    arrayFilters
    ,我不是对scheme应用
    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  
                    });
                });
    
    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  
                    });
                });