ms-dred
@ms-dred
Вечно что то не то и что то не так...

Как оптимизировать сложный запрос?

Есть некоторые запросы к базе которые выполняются более 100ms, я уже и наугад пробовал индексы создать и все безрезультатно.
Вот пример запроса
Collection
  .aggregate([
    { $match: {
      owner: request.owner._id,
      public: { $gte: 1 },
      catalog: {
          $nin: [ObjectId('id')]
      }
    }},
    { $sort: { createdAt: -1 } },
    { $skip: request.params.skip },
    { $limit: request.params.limit },
    {
    $lookup: {
      from: 'users',
      localField: 'owner',
      foreignField: '_id',
      as: 'owner'
    }
    }, {
      $project: {
        _id: 1,
        image: { $concat: ['$domain', 'thumb/', '$image', '?route=thumb&h=350'] },
        href: { $concat: [config.domain.href, 'posts/', '$url', '.html'] },
        tags: { $slice: ['$tags', 5] },
        size: {
          width: { $trunc: { $multiply: [ { $divide: ['$size.width', '$size.height'] }, 350] } },
          height: { $trunc: 350 }
        },
        style: {
          $concat: [
            'background-color: rgb(',
            { $toLower: { $arrayElemAt: [ '$pixels.rgb.r', 0 ] } }, ',',
            { $toLower: { $arrayElemAt: [ '$pixels.rgb.g', 0 ] } }, ',',
            { $toLower: { $arrayElemAt: [ '$pixels.rgb.b', 0 ] } }, ')'
          ]
        },
        owner: { $arrayElemAt: [ '$owner', 0 ] },
        likes: { $in: [request.params.sessionId, '$likes'] },
        createdAt: 1
      }
                
    }, {
      $group: {
        _id: "$_id",
        image: { $first: '$image' },
        href: { $first: '$href' },
        tags: { $first: '$tags' },
        size: { $first: '$size' },
        style: { $first: '$style' },
        owner: { $first: {
          _id: '$owner._id',
          name: '$owner.name',
          avatar: { $concat: ['background-image:url(', '$owner.avatar', ')'] },
          href: { $concat: [config.domain.href, '$owner.username', '/'] }
        } },
        likes: { $first: '$likes' },
        createdAt: { $first: '$createdAt' }
      }
    }, {
      $sort: { createdAt: -1 }
    }     
])

Он выполняется от 90-120ms, проблемный участок находится в match поле owner
Поле owner содержит ссылку на идентификатор пользователя из коллекции users
В схеме он определен следующим образом
owner: { type: mongoose.Schema.Types.ObjectId, ref: 'Users'},

Так же создан индекс для него
schema.index({ owner: 1 })
Если из условия убрать owner, запрос выполняется от 3-5ms, может быть кто то сталкивался с подобным и подскажет куда копать?
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
ms-dred
@ms-dred Автор вопроса
Вечно что то не то и что то не так...
3 дня ломал голову, но победил только после того как задал вопрос на тостере )) Что же делает животворящий тостер....
В общем решение, не хватало цепочки индекса
schema.index({ owner: 1, createdAt: 1 })
Может кому нибудь и пригодится =)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы