如何使用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); }) }) } }) 

在这个例子中,我保存reviewItem参考它在bookItem ,但我想保存reviewItem的引用数组reviewItem对象的数组。 我怎么能做到这一点?

Book在填充时预期的结果是:

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

你必须使用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); }