Mongoose findByIdAndUpdate tidak menampilkan model yang benar

103

Saya memiliki masalah yang belum pernah saya lihat sebelumnya dengan Mongoose findByIdAndUpdate tidak mengembalikan model yang benar di callback.

Berikut kodenya:

    var id = args._id;
    var updateObj = {updatedDate: Date.now()};
    _.extend(updateObj, args);

    Model.findByIdAndUpdate(id, updateObj, function(err, model) {
        if (err) {
            logger.error(modelString +':edit' + modelString +' - ' + err.message);
            self.emit('item:failure', 'Failed to edit ' + modelString);
            return;
        }
        self.emit('item:success', model);
    });

Dokumen asli di db terlihat seperti ini:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 1'
}

UpdateObj masuk terlihat seperti ini:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 2'
}  

Model yang dikembalikan dari callback identik dengan model asli, bukan updatedObj. Jika saya menanyakan db, itu telah diperbarui dengan benar. Itu hanya tidak dikembalikan dari database.

Ini terasa seperti kesalahan 'pengguna bodoh', tapi saya tidak bisa melihatnya. Setiap ide sangat dihargai.

JonRed
sumber
1
Itu tempat yang luar biasa. Dan sebagai pengingat mengapa saya harus menjaga semua proyek saya sesuai pada versinya, karena paket itu lulus pengujian unitnya sendiri. Terima kasih.
JonRed

Jawaban:

299

Dalam Mongoose 4.0, nilai default untuk newopsi findByIdAndUpdate(dan findOneAndUpdate) telah berubah menjadi false(lihat # 2262 dari catatan rilis ). Ini berarti Anda perlu secara eksplisit mengatur opsi trueuntuk mendapatkan versi baru dari dokumen tersebut, setelah pembaruan diterapkan:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...
JohnnyHK
sumber
5
Juga terperangkap oleh perubahan nilai kembalian dari metode 'buat'. Cheers buddy, saya akan memilih dua kali jika saya bisa.
JonRed
4
Juga masukkan PR untuk dokumen yang diperbarui tentang proyek luwak, jadi mudah-mudahan tidak akan menarik perhatian orang lain.
JonRed
3
Ya ampun terima kasih @JohnnyHK. Ini menghancurkan saya. Tentu saja saya ingin yang baru kembali. Mungkin lebih konsisten dengan API, tetapi tidak benar-benar dengan akal sehat ... jika saya memperbarui sesuatu, saya ingin melihat perubahannya. Terima kasih luwak ...
Peege151
21
Wow! Sungguh keputusan yang mengerikan yang mereka buat! Itu adalah satu-satunya titik melakukan pencarian di tempat pertama daripada memperbarui.
Adam Lockhart
9
Saya tidak mengerti mengapa seseorang lebih suka memiliki dokumen lama sebagai tanggapan daripada yang baru
emilioriosvz