2011-11-03 37 views
10

Tôi gặp sự cố với cập nhật tài liệu được nhúng.Mongoose tài liệu nhúng cập nhật

Schemas định nghĩa của tôi:

var Talk = new Schema({ 
    title: { 
     type: String, 
     required: true 
    }, 
    content: { 
     type: String, 
     required: true 
    }, 
    date: { 
     type: Date, 
     required: true 
    }, 
    comments: { 
     type: [Comments], 
     required: false 
    }, 
    vote: { 
     type: [VoteOptions], 
     required: false 
    }, 
}); 

var VoteOptions = new Schema({ 
    option: { 
     type: String, 
     required: true 
    }, 
    count: { 
     type: Number, 
     required: false 
    } 
}); 

Bây giờ tôi muốn cập nhật vote.count++, với trao Talk id và VoteOption id. Tôi có chức năng sau đây để thực hiện công việc:

function makeVote(req, res) { 

    Talk.findOne(req.params.id, function(err, talk) { 
     for (var i = 0; i < talk.vote.length; i++) { 
      if (talk.vote[i]._id == req.body.vote) { 
       talk.vote[i].count++; 

      } 
     } 
     talk.save(function(err) { 
      if (err) { 
       req.flash('error', 'Error: ' + err); 
       res.send('false'); 
      } else { 
       res.send('true'); 
      } 
     }); 
    }); 
} 

Tất cả mọi thứ thực hiện, tôi lấy lại res.send('true'), nhưng giá trị trên đếm không thay đổi.

Khi tôi thực hiện một số console.log Tôi thấy rằng nó đã thay đổi giá trị, nhưng talk.save chỉ không lưu nó trong db.

Ngoài ra tôi khá không hài lòng về chu kỳ chỉ để tìm _id của tài liệu được nhúng. Trong tài liệu mongoose tôi đọc về talk.vote.id(my_id) nhưng điều đó cho tôi lỗi khi không có hàm id.

Trả lời

19

Khi cập nhật loại Mixed (dường như không phải là loại cơ bản, do đó cũng bao gồm tài liệu được nhúng), người ta phải gọi .markModified trên tài liệu. Trong trường hợp này, nó sẽ là:

talk.markModified("vote"); // mention that `talk.vote` has been modified 

talk.save(function(err) { 
    // ... 
}); 

Hy vọng điều này sẽ giúp ai đó trong tương lai vì tôi không thể tìm thấy câu trả lời rất nhanh.


Reference:

... Mongoose mất khả năng tự động phát hiện/lưu những thay đổi. Để "nói" Mongoose rằng giá trị của một loại hỗn hợp đã thay đổi, hãy gọi phương thức .markModified(path) của tài liệu chuyển đường dẫn đến loại Hỗn hợp mà bạn vừa thay đổi.

+0

Anh hùng trong ngày! – MrBr

0

Đó là vì bạn đang cố lưu đối tượng trò chuyện của mình trước khi cuộc gọi lại tăng số lượng đã được kích hoạt. Ngoài ra, bạn có chắc chắn tạo nhanh lược đồ Talk của mình không? ví dụ:

var talk = new Talk(); 

Tuy nhiên, nếu tất cả các bạn muốn làm là tăng biến đếm của bạn, Mongo hỗ trợ nguyên tử, tại chỗ cập nhật mà bạn có thể tìm thấy hữu ích:

talk.find({ _id : req.body.vote }, { $inc: { count : 1 } }); 

có một cái nhìn tại địa chỉ: http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

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