2017-07-27 10 views
8

私の質問は少し素朴ですが、どこからでも検索しても答えは見つかりませんでした。mongooseでサブ文書を「保存」機能で更新するにはどうすればよいですか?

私は私がupdate機能

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

User.update({'relations.entity': 'R1'},{"$set": toupdate}, 
    function(err,results){ 
    // console.log(results); 
}); 
でそれを更新することができる午前= R1

relations.entityとユーザーの年を更新したいuser

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

のスキーマを持っています

これはうまくいきますが、私は.save()メソッドを使用したいのですが、既に上記のように他のフィールドが更新されています。私は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 
    }); 
}) 

?マルチ関係については

+0

'relations'はオブジェクトの配列であり、単一のオブジェクトではありません。フィールド '_id'はありません。私が見る唯一のIDは 'エンティティ'から来ています。 – Mikey

+0

これは '_id'フィールドを持っています。スキンでは定義されていませんが、mongooseが作成しているようです。 – Masade

+0

配列を見つけてindexの値を更新するだけで済みます。 user.name = "私の新しい名前"; \t \t \t \t index = "私の新しい名前"のようなものは、User.find({_ id: user.relations.findIndex((関連=> relation.entity == 'R1')); \t \t \t \t user.relations [インデックス] .year = 1900; user.save(関数(ERR、結果){ }); } ' – Veeram

答えて

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を使用することができます更新。

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){ 
    }); 
}); 
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); 
}); 
}); 
関連する問題