mongodb агрегат $ lookup против поиска и заполнения - PullRequest
0 голосов
/ 11 июня 2019

У меня есть такая схема видео:

const VideoSchema = new mongoose.Schema({
  caption: {
    type: String,
    trim: true,
    maxlength: 512,
    required: true,
  },
  owner: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
    required: true,
  },
  // some more fields
  comments: [{
    type: mongoose.Schema.ObjectId,
    ref: 'Comment',
  }],
  commentsCount: {
    type: Number,
    required: true,
    default: 0,
  },
}, { timestamps: true });

и простая схема комментариев, подобная этой:

const CommentSchema = new mongoose.Schema({
  text: {
    type: String,
    required: true,
    maxLength: 512,
  },
  owner: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
    required: true,
  },
  videoId: {
    type: mongoose.Schema.ObjectId,
    ref: 'Video',
    required: true,
    index: true,
  },
}, { timestamps: true });

, и с такими схемами я могу выполнять любые видызапроса find на мою коллекцию видео и заполните его комментариями:

Video.find({ owner: someUserId }).populate({ path: 'comments' });

Мой вопрос: насколько необходимо хранить идентификаторы комментариев внутри коллекции видео?учитывая, что я проиндексировал поле videoId в своей схеме комментариев, насколько плохо (если говорить о производительности) было бы избавиться от этих идентификаторов комментариев и их количества и использовать агрегацию $ lookup для поиска комментариев к видео, например:

Video.aggregate([
  {
    $match: {
      owner: someUserId,
    },
  },
  {
    $lookup: {
      from: 'comments',
      localField: '_id',
      foreignField: 'videoId',
      as: 'comments',
    }
  }
])

Насколько они отличаются с точки зрения производительности?

1 Ответ

0 голосов
/ 12 июня 2019

Ну, нет никакой возможности, чтобы $lookup был бы быстрее, чем список идентификаторов комментариев для реального видеообъекта.Я имею в виду, что вы должны сделать монету whole other request, чтобы получить их сейчас.Таким образом, производительность, очевидно, добавит время поиска.Это предполагает, что вы не используете mongoose populate для «преобразования» этих идентификаторов комментариев в объекты, на которые есть ссылки.

Если вы затем удаляете комментарии из видео (а также фактическую информацию о количестве) и выполняетепоиск это путь.Поскольку вы подходите сразу в своем аргументе, а затем делаете простое lookup, я не понимаю, как это будет для вас узким местом.Также вы можете оптимизировать / изменить / настроить агрегацию vie объяснение и т. Д.

Ваша схема видео будет довольно чистой в этом смысле:

const VideoSchema = new mongoose.Schema({
  caption: {
    type: String,
    trim: true,
    maxlength: 512,
    required: true,
  },
  owner: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
    required: true,
  },
  // some more fields
}, { timestamps: true });
...