MongoDB заполнить производительность - PullRequest
0 голосов
/ 14 мая 2018

Недавно задал такой вопрос.

Что быстрее в Монго: запросы на заполнение или отдельные ассинкеры?

Пример

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

var FeedPostCommentSchema = new Schema({

    feedPost: {type: Schema.Types.ObjectId, ref: 'FeedPost', index: true},
    user: {type: Schema.Types.ObjectId, ref: 'User'},

    comment: {
        type: String,
        trim: true
    },

    updated: {type: Date, default: Date.now},
    created: {type: Date, default: Date.now, index: true}
});

mongoose.model('FeedPostComment', FeedPostCommentSchema);

При отображении всех комментариев,нам также нужно получить пользовательские данные

Мы можем сделать это стандартным методом заполнения:

FeedPostComment.find({feedPost: req.params.postId}).populate('user')
        .skip(skip)
        .limit(limit)
        .sort({created: -1})
        .lean()
        .exec()

Мы также можем сделать это с параллельными запросами:

FeedPostComment.find({feedPost: req.params.postId})
        .skip(skip)
        .limit(limit)
        .sort({created: -1})
        .lean()
        .exec(function (err, comments) {
            async.each(comments, function (comment, cb) {
                User.findById(comment.user, function (err, composer) {
                    if (err) {
                        return cb(err);
                    }

                    comment.user = utils.getPublicDataOfUser(composer);
                    cb();
                });
            }, function (err) {
                comments.reverse();
            });
        });

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Заполнение всегда будет быстрее, чем обычный асинхронный запрос ... Но теперь это происходит даже быстрее, чем было введено, например, $lookup с pipeline ... Вы, вероятно, должны пойти с ним.

0 голосов
/ 14 мая 2018

Заполнение обычно выполняется быстрее (и более эффективно), поскольку он использует один запрос $in, чтобы получить все ссылочные документы вместо того, чтобы получать их по одному.

...