【问题标题】:How to save multiple refs to other documents in MongoDB using Mongoose?如何使用 Mongoose 将多个参考保存到 MongoDB 中的其他文档?
【发布时间】:2021-06-09 05:31:26
【问题描述】:

我正在尝试找出如何使用 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 的引用,但我想在bookItem 中保存一个带有引用数组的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"
      }
    ]
  }
]

【问题讨论】:

    标签: node.js mongodb reference mongoose populate


    【解决方案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);
    }
    

    【讨论】:

    • 在 Mongo 中运行 20 甚至 100 个循环是否可以节省性能?我想知道!
    【解决方案2】:

    您必须将新添加的评论推送到 bookItem bookItem.reiews 的评论数组。 只需尝试这样的事情,

    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",
          });
    
          bookItem.reviews.push(reviewItem)
    
          bookItem.save(function(err) {
            if (err) return handleError(err);
          })
        })
    
      }
    })

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2013-05-18
      • 2015-10-10
      • 2018-09-20
      • 1970-01-01
      • 2017-09-22
      • 2019-03-10
      相关资源
      最近更新 更多