2016-10-25 5 views
0

私はMongooseについてよく知っていますが、貧弱な文書は役立ちません(検索や関数のリスト、 ..)。Mongoose - 文書を検索し、サブ文書のいくつかのフィールドを更新します

私は会社を表し文書を持っている、とユーザーを表し、サブ文書:

{ 
    "_id": "57ffa47f5b70f90831212348", 
    "name": "mycompany", 
    "address": "...", 
    "phone": "...", 
    "users": [ 
     { 
      "_id": "57ffa47f5b70f90831212347", 
      "username": "alpha", 
      "name": "myname", 
      "surname": "mysurname", 
      "password": "..." 
     } 
    ] 
} 

私は特定の下位ドキュメントを見つけて、ちょうどいくつかのフィールド更新する(名前、姓、パスワードを、...)フロントエンドから渡されます。

"company_shortname": "CMPNY", 
    "company_id": "57ffa47f5b70f90831212348", 
    "user": { 
     "id_access_level": 0, 
     "surname": "ltd", 
     "name": "mycompany", 
     "username": "mycompanyusername", 
     "_id": "57ffa47f5b70f90831212347", 
     "password": "..." 
    } 
} 

私が取得したいことは、編集subdocサブを見つけることである(会社含まれています。私はreq.bodyを受け取る

は、ログインしているユーザーが含まれています(つまり、req.body.name)とreq.user編集したフィールドが含まれていますこのサブクォートは常にログインしているユーザーと同じです)、渡された更新データ、および保存します。

このanswerを使用して、私が試した:

Company.find({'_id': req.user.company_id}).select('name').exec(
     function(err, company) { 

      if (err) res.status(500).send(err); 

      var partialUpdate = req.body; 

      var set = {}; 
      for (var field in partialUpdate) { 
      set['users.$.' + field] = partialUpdate[field]; 
      } 

      company.update({_id: req.user._id, "users._id": req.body._id}, 
      {$set: set}, 
      function(err, numAffected) { 
      console.log('Number of users edited: ' +JSON.stringify(numAffected,null,4)); 
      }); 
     }); 

が、私は得ることができない、それは...任意のアイデアを仕事に?

答えて

0

私はこのクエリを使用して解決:

//saving in 'set' the fields to be edited 
var partialUpdate = req.body; 
    var set = {}; 
    for (var field in partialUpdate) { 
    set['users.$.' + field] = partialUpdate[field]; 
    } 

    //find the company,then the subdoc, then set the fields with 'set' 
    Company.findOneAndUpdate({ 
     '_id': req.user.company_id, "users._id" : req.body._id}, 
     {$set: set}, 
     function(err, company) { 
     //the company status after the update 
     console.log('company updated: ' +JSON.stringify(company,null,4)); 
     }); 
関連する問題