Ada beberapa hal di sini yang tidak bagus, tetapi pertama-tama untuk membahas dasar-dasarnya dan membuat Anda maju.
Hal pertama adalah memperbaiki metode yang memanggil sisi sudut layanan. Titik akhir API tentu tidak mengharapkan sintaks pembaruan MongoDB yang Anda gunakan, melainkan hanya sebuah objek. Jadi pertama-tama perbaiki itu:
$scope.saveComment = function(i){
console.log("id is " + i);
// Split these out so they are easy to log and debug
var path = '/api/its' + i;
// This must mirror the structure expected in your document for the element
// Therefore "comments" is represented as an array of objects, even
// where this is only one.
var data = {
comments: [{
words: $scope.comment,
userId: $scope.getCurrentUser().name
}]
};
// Call service with response
$http.put(path,data).success(function(stuff){
document.location.reload(true);
});
}
Sekarang ujung API server Anda memiliki beberapa kesalahan, saya lebih suka mendesain ulang total, tetapi karena kurangnya info, hanya berkonsentrasi untuk memperbaiki masalah utama tanpa banyak berubah.
Dengan asumsi ini adalah lodash
perpustakaan, .merge()
fungsi di sini diimplementasikan secara tidak benar. Perlu diberitahukan bagaimana cara “menangani” isi array yang di “merge” dengan baik, dan saat ini yang terbaik yang akan terjadi adalah “overwrite”. Jadi kami memberikannya beberapa kecerdasan:
// Updates an existing it in the DB.
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findById(req.params.id, function (err, it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
var updated = _.merge(it, req.body,function(a,b) {
if (_.isArray(a)) {
return a.concat(b); // join source and input
}
});
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, updated);
});
});
};`
Tapi ada tangkapan untuk itu, karena hanya akan "menambahkan" ke array. Jadi, jika Anda memasukkan sesuatu ke dalam input yang sudah ada, maka item asli dan apa pun di input array akan ditambahkan.
Mengatasinya adalah masalah lain yang harus diselesaikan, tergantung pada kebutuhan Anda.
Dari sudut pandang saya sendiri, saya hanya akan mengirim larik jika memungkinkan dan memiliki titik akhir yang "hanya" untuk ditambahkan ke larik dokumen, daripada pembaruan dokumen "umum" seperti yang Anda miliki di sini.
Ini memungkinkan Anda untuk memanfaatkan fungsi pembaruan MongoDB dengan lebih baik, sesuai tindakan yang diharapkan. Jadi sesuatu seperti ini dalam panggilan layanan:
// comment can just be a singular object now
$http.put(path,{
"words": "this that",
"userId": 123
}).success(function(stuff){
Dan di akhir API server:
exports.addComment = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findByIdAndUpdate(req.params.id,
{ "$push": { "comments": req.body } },
{ "new": true },
function(err,it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
return res.json(200, it);
}
);
};
Jadi itu hanya akan mengambil isi "komentar" dan menambahkannya ke array. Yang paling penting ia melakukan ini "secara atom", sehingga tidak ada permintaan lain yang mungkin dapat bertabrakan dalam melakukan sesuatu seperti yang dilakukan "penggabungan" saat ini. Permintaan lain ke titik akhir yang sama hanya akan "ditambahkan" ke larik dalam status saat ini seperti saat permintaan dibuat, dan begitu juga dengan ini.
Itulah yang $push
operator untuk, jadi sebaiknya gunakan.
Beberapa bahan untuk dipikirkan.