如何在mongoose中使用“保存”功能更新子文档?

时间:2017-07-27 14:21:27

标签: mongodb mongoose

我的问题有点幼稚,但在搜索到处后我找不到答案。

我的架构为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()之前编写逻辑?

3 个答案:

答案 0 :(得分:3)

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){
  });
});

答案 1 :(得分:3)

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更新年份。

答案 2 :(得分:0)

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);
});
});