2014-05-23 56 views
13

Tôi đã tìm kiếm nhiều câu hỏi trên các đối tượng lồng nhau, nhưng tất cả những gì tôi tìm thấy có liên quan đến mảng [s].Cập nhật đối tượng lồng nhau trong mongoose

Tôi đang tìm một đối tượng lồng nhau được cập nhật đơn giản trong mongoose.

Từ đây http://mongoosejs.com/docs/guide.html

there is an example schema : 
var blogSchema = new Schema({ 
    title: String, 
    author: String, 
    body: String, 
    comments: [{ body: String, date: Date }], 
    date: { type: Date, default: Date.now }, 
    hidden: Boolean, 
    meta: { 
    votes: Number, 
    favs: Number 
    } 
}); 

Sau khi tạo một tài liệu,

Làm thế nào tôi có thể thay đổi số favs sau này?

Không có tài liệu nào giống như tôi có thể tìm thấy.

Đây là những gì tôi đã làm:

blog.findById(entityId, function(err, mainDoc){ 
     if(err || !mainDoc) return next(err || 'Document not found'); 
     var subDoc = mainDoc['meta']; 
     if(subDoc){ 
     subDoc = _.extend(subDoc, { favs : 56 }); //_ lib already available 
     console.log(mainDoc.get('meta')); //Prints the updated result with favs = 56 OK 
     mainDoc.save(function(err, doc){ 
      console.log(doc.get('meta')); // prints the updated results with favs = 56 OK 
     }); 
     } else next('Not found'); 
    }); 

Mọi thứ hoạt động tập tin và tất cả các giao diện điều khiển cung cấp cho các kết quả mong muốn.

Nhưng khi tôi chuyển sang bảng điều khiển mongoose và truy vấn tài liệu, tôi không nhận được kết quả được cập nhật.

Tôi biết có thể có những cách khác để đạt được điều tương tự, nhưng tôi chỉ tìm kiếm những gì tôi đang làm sai trong mã cụ thể này.

Tại sao bảng điều khiển, sau khi lưu tài liệu, cung cấp dữ liệu chưa được so khớp từ cơ sở dữ liệu?

Khi bật tùy chọn gỡ lỗi mongoose, tôi đã tìm thấy truy vấn trong không có dữ liệu nào được cập nhật. Truy vấn kích hoạt với bộ $ trống. {$ Thiết lập: {}}

Trả lời

15

Nếu bạn chỉ muốn thay đổi giá trị của favs, bạn có thể sử dụng một truy vấn đơn giản:

blog.findByIdAndUpdate(entityId, {$set: {'meta.favs': 56}}, function(err, doc) { 
    console.log(doc); 
}); 
+3

Tôi biết rõ đây là câu trả lời tốt hơn. nhưng tôi đã thực sự tìm kiếm những gì tôi đang làm sai trong mã trên của tôi. – codeofnode

+0

Nếu 'favs' là một biến. Sau đó làm thế nào tôi có thể đạt được một cái gì đó như dưới đây? blog.findByIdAndUpdate (entityId, {$ set: {'meta [favs]': 56}}, chức năng (err, doc) { console.log (doc); }); –

0

Vấn đề là bạn không thể làm bất cứ điều gì với dữ liệu từ cầy mangut một khi bạn đã có nó khác hơn là gửi nó cho khách hàng.

BAO GIỜ, có phương pháp gọn gàng làm cho nó để bạn có thể cập nhật thông tin và làm bất cứ điều gì bạn muốn với nó.

Đó sẽ trông như thế này:

blog.findById(entityId).lean().exec(function (err, mainDoc) { 
    if (err || !mainDoc) { 
     return next(err || 'Document not found'); 
    } 
    var subDoc = mainDoc.meta; 
    if(subDoc){ 
     subDoc.favs = 56; 
     blog.update({_id: entityId}, mainDoc, function(err, doc){ 
      console.log(doc.get('meta')); 
     }); 
    } else { 
     next('Not found'); 
    } 
}); 
Các vấn đề liên quan