พังพอน findByIdAndUpdate ไม่ส่งคืนโมเดลที่ถูกต้อง


106

ฉันมีปัญหาที่ฉันไม่เคยเห็นมาก่อนโดยที่พังพอน findByIdAndUpdate ไม่ส่งคืนโมเดลที่ถูกต้องในการติดต่อกลับ

นี่คือรหัส:

    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);
    });

เอกสารต้นฉบับใน db มีลักษณะดังนี้:

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

updateObj ที่เข้ามามีลักษณะดังนี้:

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

โมเดลที่ส่งคืนจากการเรียกกลับจะเหมือนกับโมเดลเดิมไม่ใช่ updatedObj หากฉันสอบถาม db แสดงว่ามีการอัปเดตอย่างถูกต้อง เพียงแค่ไม่ถูกส่งคืนจากฐานข้อมูล

รู้สึกเหมือนเป็นข้อผิดพลาด 'ผู้ใช้โง่' แต่ฉันมองไม่เห็น ความคิดใด ๆ ที่ชื่นชมอย่างมาก


1
นั่นเป็นจุดที่น่ากลัว และขอเตือนว่าทำไมฉันต้องให้โปรเจ็กต์ทั้งหมดตรงกับเวอร์ชันเนื่องจากแพ็คเกจนั้นผ่านการทดสอบหน่วยของตัวเอง ขอขอบคุณ.
JonRed

คำตอบ:


308

ใน Mongoose 4.0 ค่าเริ่มต้นสำหรับnewตัวเลือกของfindByIdAndUpdate(และfindOneAndUpdate) ได้เปลี่ยนเป็นfalse(ดู # 2262 ของบันทึกย่อประจำรุ่น ) ซึ่งหมายความว่าคุณต้องตั้งค่าตัวเลือกอย่างชัดเจนtrueเพื่อรับเอกสารเวอร์ชันใหม่หลังจากที่ใช้การอัปเดตแล้ว:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

5
นอกจากนี้ยังพบการเปลี่ยนแปลงค่าส่งคืนของเมธอด 'สร้าง' ไชโยเพื่อนฉันจะโหวตสองครั้งถ้าทำได้
JonRed

4
ใส่ PR สำหรับเอกสารที่อัปเดตในโครงการพังพอนด้วยดังนั้นหวังว่ามันจะไม่โดนใจใคร
JonRed

3
โอ้เด็กขอบคุณ @JohnnyHK สิ่งนี้ทำให้ฉันอับอาย แน่นอนฉันต้องการตัวใหม่กลับมา อาจจะสอดคล้องกับ API มากขึ้น แต่ก็ไม่เป็นไปตามสามัญสำนึก ... ถ้าฉันอัปเดตบางสิ่งฉันต้องการเห็นการเปลี่ยนแปลง ขอบคุณพังพอน ...
Peege151

25
ว้าว! ช่างเป็นการตัดสินใจที่น่ากลัวจริงๆ! นั่นเป็นจุดเดียวในการค้นหาตั้งแต่แรกแทนที่จะอัปเดต
Adam Lockhart

10
ฉันไม่เข้าใจว่าทำไมใครบางคนถึงต้องการให้เอกสารเก่าในการตอบกลับแทนที่จะเป็นเอกสารใหม่
emilioriosvz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.