2015-05-11 14 views
5

Khi tôi cố gắng lưu tài liệu của mình, tôi nhận được lỗi VersionError: No matching document found, tương tự như this SO câu hỏi.Mongoose: Tăng số phiên bản tài liệu của tôi không hoạt động và tôi gặp lỗi Phiên bản khi cố gắng lưu

Sau khi đọc this bài đăng trên blog, có vẻ như vấn đề là với phiên bản tài liệu của tôi. Rằng tôi đang rối tung với một mảng và vì vậy tôi cần phải cập nhật phiên bản.

Tuy nhiên, gọi document.save() không hoạt động đối với tôi. Khi tôi đăng xuất tài liệu trước và sau cuộc gọi đến save(), document._v là điều tương tự.

Tôi cũng đã thử thực hiện document._v = document._v++ cũng không hoạt động.


exports.update = function(req, res) { 
    if (req.body._id) { delete req.body._id; } 
    User.findById(req.params.id, function(err, user) { 
    if (err) return handleError(res, err); 
    if (!user) return res.send(404); 
    var updated = _.extend(user, req.body); // doesn't increment the version number. causes problems with saving. see http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html 
    console.log('pre increment: ', updated); 
    updated.increment(); 
    // updated._v = updated._v++; 
    console.log('post increment: ', updated); 
    updated.save(function(err) { 
     if (err) return handleError(res, err); 
     return res.json(200, user); 
    }); 
    }); 
}; 

Output

pre increment: { _id: 5550baae1b571aafa52f070c, 
    provider: 'local', 
    name: 'Adam', 
    email: '[email protected]', 
    hashedPassword: '/vahOqXwCwKQKtcV3KBQeFge/YB0xtqOj+YDyck7gzyALA/IP7u7BfqQhlVHBQT26//XfBTkaOCK2bQXg65OzA==', 
    salt: 'MvzXW7D4xuyGQBJNeFRoUg==', 
    __v: 32, 
    drafts: [], 
    starredSkims: [], 
    skimsCreated: [ 5550cfdab8dcacd1a7892aa4 ], 
    role: 'user' } 

post increment: { _id: 5550baae1b571aafa52f070c, 
    provider: 'local', 
    name: 'Adam', 
    email: '[email protected]', 
    hashedPassword: '/vahOqXwCwKQKtcV3KBQeFge/YB0xtqOj+YDyck7gzyALA/IP7u7BfqQhlVHBQT26//XfBTkaOCK2bQXg65OzA==', 
    salt: 'MvzXW7D4xuyGQBJNeFRoUg==', 
    __v: 32, 
    drafts: [], 
    starredSkims: [], 
    skimsCreated: [ 5550cfdab8dcacd1a7892aa4 ], 
    role: 'user' } 

Trả lời

3

Vấn đề ở đây đã làm với sử dụng __v và cố gắng để cập nhật nó bằng tay. .increment không thực sự thực hiện gia tăng ngay lập tức, nhưng nó thiết lập một cờ nội bộ cho mô hình để xử lý gia tăng. Tôi không thể tìm thấy bất kỳ tài liệu nào trên .increment, vì vậy tôi cho rằng nó có thể được sử dụng trong nội bộ. Vấn đề bắt nguồn từ việc cố gắng kết hợp .extend với đối tượng đã có __v (có hai dấu gạch dưới bằng cách này, không phải là document.__v++ cũng ảnh hưởng đến mô hình bên trong) ngoài việc sử dụng .increment.

Khi bạn sử dụng _.extend, hãy sao chép thuộc tính __v trực tiếp vào đối tượng có vẻ gây ra sự cố vì Mongoose không thể tìm thấy phiên bản cũ trong nội bộ. Tôi đã không đào sâu đủ để tìm hiểu lý do tại sao điều này đặc biệt, nhưng bạn có thể giải quyết nó bằng cách thêm delete req.body.__v.

Thay vì tìm và lưu dưới dạng hai bước, bạn cũng có thể sử dụng .findByIdAndUpdate. Lưu ý rằng điều này không không sử dụng __v hoặc tăng nội bộ lên. Khi câu trả lời khác và lỗi được liên kết chỉ ra, nếu bạn muốn tăng phiên bản trong khi cập nhật, bạn phải làm như vậy theo cách thủ công.

0

Versioning được thực hiện để giảm thiểu doc.save() do thiết kế (không Model.update vv). Nhưng nếu bạn muốn, bạn có thể thử cách sau thay vì:

{$set: {dummy: [2]}, $inc: { __v: 1 }} 

Tuy nhiên đây là một khẳng định sự lỗi theo link

Vui lòng xác nhận phiên bản mongoose của bạn từ cột mốc của vấn đề trên.

Cảm ơn :)

+1

"Phiên bản đã được triển khai để giảm thiểu doc.save() theo thiết kế (không phải Model.update v.v.)" - Tôi không hiểu điều đó có nghĩa là gì. "xác nhận lỗi" - có vẻ như nó đang nói về 'update' và' findByIdAndUpdate', nhưng tôi không làm một trong số đó (tôi đã sử dụng từ "update" do nhầm lẫn trong câu hỏi của mình, nhưng mã của tôi cho thấy rằng tôi ' m gọi 'save()') –

Các vấn đề liên quan