2014-12-02 39 views
1

我想知道如何使用Mongoose在MongoDB中保存多個對其他文檔的引用。將一個引用保存到其他文檔並不是什麼大事,但是當您想要將多個引用保存到其他文檔並在稍後填充它時,它會變得很複雜。如何使用Mongoose將多個參考文件保存到MongoDB中的其他文檔?

讓我們看看我有什麼:

var mongoose = require('mongoose'), 
     Schema = mongoose.Schema; 

var Book = Schema({ 
    title: String, 
    reviews: [{ type: Schema.Types.ObjectId, ref: 'Review' }] 
}); 

var Review = Schema({ 
    body: String 
}); 

var Book = mongoose.model('Book', bookSchema); 
var Review = mongoose.model('Book', reviewSchema); 

var reviewItem = new Review({body: "review content"}); 

Book.find({}).exec(function(err, collection) { 
    if(collection.length === 0) { 

     reviewItem.save(function (err) { 
      if (err) return handleError(err); 

      var bookItem = new Book({ 
       title: "book title", 
       reviews: reviewItem._id 
      }); 

      bookItem.save(function (err) { 
       if (err) return handleError(err); 
      }) 
     }) 

    } 
}) 

在這個例子中,我參考它在bookItem節省reviewItem,但我想保存reviewItem對象與引用數組的數組中bookItem。我怎麼能做到這一點?

填充Book當我期待的結果:

[ 
    { 
    "_id": "547b1a4685207124a085d0c5", 
    "title": "The Enterprise And Scrum", 
    "reviews": [ 
     { 
     "_id": "547b1a4685207124a085d0c3", 
     "body": "review 1" 
     }, 
     { 
     "_id": "543d99564d01f3de94655ba2", 
     "body": "review 2" 
     }, 
     { 
     "_id": "543d995625755d19ba72863d", 
     "body": "review 3" 
     } 
    ] 
    } 
] 

回答

1

你必須使用book.reviews.push。這是一個工作示例:

var async = require('async'); 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test'); 

var Review = mongoose.model('Review', { 
    body: String 
}); 

var Book = mongoose.model('Book', new Schema({ 
    title: String, 
    reviews: [{ type: Schema.Types.ObjectId, ref: 'Review' }] 
})); 

async.parallel([ 
    function(next) { Book.remove({}, next); }, 
    function(next) { Review.remove({}, next); }], 
    function() { 
     async.map(['review 1', 'review 2', 'review 3'], createReview, function(err, reviews) { 
      var book = new Book({ title: 'something clever' }); 
      for(var i = 0; i < reviews.length; i++) { 
       book.reviews.push(reviews[i]); 
      } 

      book.save(function(err, doc) { 
       Book.find({}) 
        .populate('reviews') 
        .exec(function (err, books) { 
         console.log(err, books); 
        }); 
      }); 
     });  
    }); 

function createReview(body, fn) { 
    var review = new Review({ body: body }); 
    review.save(fn); 
} 
相關問題