Mongoose findByIdAndUpdate không trả về mô hình chính xác


99

Tôi gặp sự cố mà tôi chưa từng gặp trước đây với Mongoose findByIdAndUpdate không trả về mô hình chính xác trong lệnh gọi lại.

Đây là mã:

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

Tài liệu gốc trong db trông như thế này:

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

Bản updateObj đi vào trông như thế này:

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

Mô hình được trả về từ lệnh gọi lại giống với mô hình ban đầu, không phải là updatedObj. Nếu tôi truy vấn db, nó đã được cập nhật chính xác. Nó chỉ không được trả về từ cơ sở dữ liệu.

Điều này giống như một lỗi 'người dùng ngu ngốc', nhưng tôi không thể nhìn thấy nó. Bất kỳ ý tưởng đánh giá rất cao.


1
Đó là một điểm tuyệt vời. Và một lời nhắc nhở tại sao tôi cần giữ cho tất cả các dự án của mình khớp trên các phiên bản, vì gói đó đã vượt qua các bài kiểm tra đơn vị của chính nó. Cảm ơn bạn.
JonRed

Câu trả lời:


294

Trong Mongoose 4.0, giá trị mặc định cho newtùy chọn findByIdAndUpdate(và findOneAndUpdate) đã thay đổi thành false(xem # 2262 của ghi chú phát hành ). Điều này có nghĩa là bạn cần đặt tùy chọn rõ ràng trueđể tải phiên bản mới của tài liệu, sau khi áp dụng bản cập nhật:

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

5
Cũng bị bắt bởi những thay đổi đối với các giá trị trả về của phương thức 'create'. Chúc mừng bạn, tôi sẽ bỏ phiếu hai lần nếu có thể.
JonRed

4
Đồng thời đưa ra một bài PR cho các tài liệu cập nhật về dự án mongoose, vì vậy hy vọng nó sẽ không bắt bất kỳ ai khác.
JonRed

3
Oh boy cảm ơn bạn @JohnnyHK. Điều này làm tôi đắm chìm. Tất nhiên tôi muốn cái mới trở lại. Có thể phù hợp hơn với API, nhưng không thực sự phù hợp với thông thường ... nếu tôi cập nhật thứ gì đó, tôi muốn xem các thay đổi. Cảm ơn mongoose ...
Peege151

21
Chà! Thật là một quyết định kinh khủng mà họ đã thực hiện! Đó là điểm duy nhất của việc tìm kiếm ngay từ đầu thay vì cập nhật.
Adam Lockhart

9
Tôi không hiểu tại sao một người nào đó thà có tài liệu cũ trong phản ứng thay vì mới
emilioriosvz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.