如何使用猫鼬中的“保存”功能更新子文档?

问题描述:

我的问题有点幼稚,但到处搜索后我找不到答案。如何使用猫鼬中的“保存”功能更新子文档?

我有user

name: {type:String}, 
relations: [{ 
    entity: mongoose.Schema.Types.ObjectId, 
    year: {type:Number} 
}] 

的模式我想relations.entity = R1更新用户的年

我能够与update功能

var toupdate = {} 
toupdate["relations.$.year"] = 1900; 

User.update({'relations.entity': 'R1'},{"$set": toupdate}, 
    function(err,results){ 
    // console.log(results); 
}); 
进行更新

虽然这个效果很好,但我想使用.save()方法,因为我有其他已经更新过的字段。

User.find({_id:"myid"},function(err,user){ 
    user.name = "my new name"; 

    // find the relation matching the relations.entity = "R1" 

    user.save(function(err,results){ 
     // send my results returned 
    }); 
}) 

如何在致电save()之前编写逻辑?

+0

'关系'是一个对象数组,而不是单个对象。它没有字段'_id'。我看到的唯一ID是来自'entity'。 – Mikey

+0

它有一个'_id'字段,看起来像猫鼬正在创建它,虽然没有在模式中定义。 – Masade

+0

你只需要找到数组并更新index处的值。像'User.find({_ ID: “身份识别码”, 'relations.entity': 'R1'},功能(ERR,用户){ user.name = “我的新名字”; \t \t \t \t指数= user.relations.findIndex((关系=> relation.entity == 'R1')); \t \t \t \t user.relations [指数] .year = 1900; user.save(功能(ERR,结果){ }); })' – Veeram

var year = 1900; 
var entity = "R1" 

User.find({_id:"myid"},function(err,user){ 
    user.name = "my new name"; 
    if (user.relations && Object.prototype.toString.call(user.relations) === '[object Array]') { 
     user.relations.forEach((relation, index , relations) => { 
      if(relation.entity === entity ) { 
      relations[index].year = year; 
      } 
     }) 
    } 
    // find the relation matching the relations.entity = "R1" 

    user.save(function(err,results){ 
     // send my results returned 
    }); 
}) 

对于多关系更新,您可以更改实体阵列,通过的indexOf更新一年。

User.findOne({_id:"myid"},function(err,user){ 
    user.name = "my new name"; 
    var tmp = user.relations; 
    _.forEach(tmp,function(aObj){ 
    if(aObj.entity == 'R'){ 
     aObj.year = 1900; 
    } 
    }); 
    user.relations = tmp; 
    user.save(function(err,results){ 
    }); 
}); 

User.findOne({_id:"myid"}) 
.deepPopulate('relations.entity') 
.exec(function(err,user) { 
user.name = "my new name"; 
var tmp = user.relations; 
_.forEach(tmp,function(aObj){ 
if(search variable path == 'R'){ 
aObj.year = 1994; 
} 
}); 
user.relations = tmp; 
user.save(function(err,results){ 
console.log("results",results); 
}); 
});