2012-02-10 29 views
5

thể trùng lặp:
Why can’t you modify the data returned by a Mongoose Query (ex: findById)mongoose Sửa đổi đối tượng kết quả theo nghĩa đen không hoạt động

Trước tiên tôi đang làm cho các truy vấn để MongoDB, nhận được tất cả các kết quả đúng nhưng chỉ thay đổi nhỏ để đối tượng chữ không hoạt động. Điều tôi đang cố gắng làm là thêm trường mới vào nhận xét. Tôi đã cố gắng sử dụng phương pháp DBref nhưng nó đã không làm việc vì vậy tôi thực hiện 2 truy vấn ngay bây giờ.

var query = Rss.findOne({ _id: itemId}); 
query.exec(function(err, feed) { 
    if (!err && feed.comments) { 
    console.log(feed.comments.length); 
    for (var index in feed.comments) { 
     var author = feed.comments[index].author; 
     if (author !== undefined) { 
     User.findById(author, function(err, user) { 

      /**Problem is here **/ 
      feed.comments[index].name = 'Some random field'; 
      console.log('Added new field' + util.inspect(feed)); 

     }); 
     } 

    } 
    } 
}); 

Ngoài ra, phản hồi là trường này không có trường .name bị thiếu.

Added new field{ _id: 4f34f343c7b0434217000012, 
    original_link: 'http://com', 
    publish_date: Fri, 10 Feb 2012 10:36:00 GMT, 
    summary: 'some text', 
    title: 'title exampel', 
    comments: 
    [ { body: 'well', 
     author: 4f30265e6f60dc061d000002, 
     _id: 4f34f3b6f96c58541700000f, 
     create_date: Fri, 10 Feb 2012 10:38:46 GMT } ], 
    create_date: Fri, 10 Feb 2012 10:36:51 GMT } 

// EDIT biết thêm thông tin

Vâng tôi đã không tìm thấy câu trả lời nhưng một số cách console.log (feed.comments [index]) trả về tham chiếu đến hoạt động. Có thể ai đó có nhiều kinh nghiệm hơn với người Mông Cổ có thể giải thích điều gì sẽ là giải pháp trong tình huống này.

{ [Function] author: 'Some random field' } 
+0

Tôi không biết về việc trả lại hàm, nhưng 'chỉ mục' của bạn không làm những gì bạn muốn. Bạn không nên lặp qua mảng bằng cách sử dụng 'for..in'. Sử dụng vòng lặp 'for' thích hợp với một dải ô. Ngoài ra 'findById' là không đồng bộ và bạn không bao giờ bắt chỉ mục là một phạm vi mới, vì vậy bạn sẽ luôn sử dụng chỉ mục cuối cùng khi đặt tên. – loganfsmyth

+0

có điều này đúng không, cách tốt nhất để giải quyết vấn đề cuối cùng là gì? –

+1

Bạn sẽ cần phải nắm bắt chỉ mục mảng trong một phạm vi mới. Thông thường bạn sẽ bọc nội dung của giao diện bằng '(hàm (chỉ mục) {...}) (chỉ mục);'. Điều đó tạo ra và ngay lập tức thực hiện một hàm mới, do đó giá trị của chỉ mục bên trong hàm được bắt trong một bao đóng với hàm gọi lại findOne. – loganfsmyth

Trả lời

10

Bạn phải yêu cầu Mongoose chuyển đổi kết quả thành đối tượng thích hợp. Trước khi sửa đổi đối tượng nguồn cấp dữ liệu, chỉ cần gọi:

feed = feed.toObject(); 

Và sau đó bạn có thể thêm tất cả các thuộc tính bổ sung mà bạn muốn.

+0

Cảm ơn bạn! Tôi mất nhiều giờ để tìm ra điều này! Bây giờ tôi biết những gì tôi đang tìm kiếm, đây là liên kết đến tài liệu API: http://mongoosejs.com/docs/api.html#document_Document-toObject – Pascal

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