2016-03-21 20 views
0

Açıkladığımdan emin olmak için sorunu çözeceğim.Özel bir nesne için karmaşık bir şemaya bir Mongoose PUT gerçekleştirilmesi sorunu

Web uygulamam MEAN.js kullanıyor, bu durumda mongoose sunucu tarafı denetleyicisinde bir güncelleme işlevi uyguluyorum. Bu şema kullanılarak:

istemci tarafında açılı kontrol kod iyi çalışmaktadır ve bana MongoDB takın doğru nesne gönderiyor

Özel bir nesnenin bir dizi diğer ilgili şema nesneleri kapsayan sahip veritabanı, bir görev nesnesine başvuru yapan güncellemelerin bir listesini, Taskstate nesnesindeki bir değişikliği ve gerçekleşen zaman güncellemelerini ifade eder.

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

I Tlp nesnesinde dizisi üzerinde döngü olur, ve dizideki her güncelleştirme için özel nesneler oluşturur, ve son olarak veritabanında ekler bir fonksiyonu uygulanmaktadır. Veri veri tabanında kalıcıdır

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 

sunucu tarafı firavunfaresi kontrol, sorun aşağıdaki gibi NesneKimliği ile ek _ID değeri I Tlp dizideki her güncelleştirme için sokulur için bir referans sahip olmasıdır:

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

Sunucu tarafı denetleyicisinde oluşturduğum nesneye eklenen ObjectID başvurusu ile _id değerini belirtmek için bu yıldızları ekledim, her defasında aynı nesne üzerinde bir güncelleştirme yaptığımda sorun devam ediyor. Daha sonra 500 hata oluşturur ve üretimde iyi çalışması için ihmal edilmelidir, yardım etmeyi takdir ediyorum, bunu yapmam gereken bir java betiği olduğunu düşünüyorum.

cevap

1

Varsayılan olarak, mongoose, nesnelerdeyse dizi öğelerine _id alanını ekler. Sadece şemaya _id: false ekleyin:

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

Thats tam olarak, teşekkürler Tom –

+0

onu test sonra, ben yeni bir güncelleme PUT ilk kez çalışır, ikinci kez bir null ekler –

+0

aşağıdaki gibi bir null ekler ilk güncelleştirme gerçekleştikten sonra aşağıdaki gibi otomatik olarak {"_id": ObjectId ("56f053cd7e4ca6602e208d91"), "title": "job1", "tupdates": [{"task": ObjectId ("567a9c6690f3ccd10b0e709a"), "tstate ": ObjectId (" 5693bb0f804936f167fe9ec2 ")}, null, {" task ": ObjectId (" 567a9c4b90f3ccd10b0e7099 ")," tstate ": ObjectId (" 5693bb0f804936f167fe9ec2 ")}]," task ": [ObjectId (" 567a9c4b90f3ccd10b0e7099 "), ObjectId ("567a9c6690f3ccd10b0e709a"), ObjectId ("567) a9c7f90f3ccd10b0e709b ")]} –