2016-03-21 9 views
0

私はそれをうまく説明したことを確認するために、問題を解決します。複雑なスキーマにカスタムオブジェクト用のMongoose PUTを実装する際の問題

私のWebアプリケーションはMEAN.jsを使用しています。この場合、私はmongooseサーバー側コントローラで更新機能を実装しています。 このスキーマを使用して:

クライアント側の角コントローラコードが正常に動作している、そしてそれは私にはMongoDB

に挿入する権利オブジェクトを送信している

私は他の関連するスキーマ・オブジェクトからなるカスタムオブジェクトの配列を持っていますタスクオブジェクトを参照する更新のリスト、Taskstateオブジェクトの変更、および発生した時刻の更新を表します。

tupdates:[{ 
     task:{ 
      type: Schema.ObjectId, 
      ref: 'Task' 
     }, 
     tstate:{ 
      type: Schema.ObjectId, 
      ref: 'Tstate' 
     }, 
     startedat: Date, 
     stoppedat: Date, 
     updatedby:{ 
      type: Schema.ObjectId, 
      ref: 'User' 
     }, 
    }] 

Iは、REQのオブジェクトの配列をループだろう機能を実装し、アレイ内の各更新のカスタムオブジェクトを作成し、最終的にデータベースに挿入します。データがデータベースに保持されている

var mongoose = require('mongoose'), 
Job = mongoose.model('Job'); 
    exports.update = function(req, res){ 
    var job = req.job; 

    //check for updates 
    if(req.body.tupdates.length>0){ 
    for (var j=0; j<req.body.tupdates.length; j++){ 

     var theobj = req.body.tupdates[j]; 
     var tupdate = ({ 
      task : theobj.task._id, 
      tstate: theobj.tstate._id 
     }); 
job.tupdates.push(tupdate); 
     } 
    } 
    job.save(function(err){ 
     if(err){ 
      return res.status(400).send({ 
       message: getErrorMessage(err) 
      }); 
     }else{ 
      res.json(job); 
     } 
    }); 
};enter code here 

サーバーサイドマングースコントローラは、問題は次のようにオブジェクトIDを持つ追加_id値IがREQアレイの各更新のために挿入されるための基準を持っていないということである。

db.jobs.find() 
{ "_id" : ObjectId("56eff14d4b343c7f0a71f33c"), "creator" : ObjectId("55ddd115a2904424680263a0"), "title" : "Job1", "tupdates" : [ { "task" : ObjectId("567a9c4b90f3ccd10b0e7099"), "tstate" : ObjectId("5693bb0f804936f167fe9ec2"), *"_id" : ObjectId("56eff38e095a2fa41312d876")*} ]} 

これらの星を追加して、サーバー側コントローラで作成したオブジェクトにObjectId参照が追加された_id値を指定しましたが、同じオブジェクトに対して更新を行うたびに問題は解決しません。それは後で500のエラーを生成し、機能が正常に動作するために省略しなければならない、私は助けていただきありがとうございます、それは私が作る必要があるJavaスクリプトの微調整だと思っています。

答えて

1

デフォルトでは、mongooseはオブジェクトがオブジェクトの場合、配列要素に_idフィールドを追加します。 はちょうどあなたのスキーマに_id: falseを追加します。

tupdates:[{ 
     _id: false, 
     task:{ 
      type: Schema.ObjectId, 
      ref: 'Task' 
     }, 
     tstate:{ 
      type: Schema.ObjectId, 
      ref: 'Tstate' 
     }, 
     startedat: Date, 
     stoppedat: Date, 
     updatedby:{ 
      type: Schema.ObjectId, 
      ref: 'User' 
     }, 
    }] 
+0

厥まさにそれを、感謝トム –

+0

それをテストした後、それは私が新しいアップデートをPUT初めての作品 –

+0

それがnullを追加し、次のように、二回目は、それがヌルを挿入します {"_id":ObjectId( "56f053cd7e4ca6602e208d91")、 "title": "job1"、 "tupdates":[{"task":ObjectId( "567a9c6690f3ccd10b0e709a")、 "tstate" ( "567a9c4b90f3ccd10b0e7099")、 "tstate":ObjectId( "5693bb0f804936f167fe9ec2")}、 "タスク":[ObjectId( "567a9c4b90f3ccd10b0e7099")、ObjectId ( "567a9c6690f3ccd10b0e709a")、ObjectId( "567 a9c7f90f3ccd10b0e709b ")]} –