MongoDb сортирует медленно с поисковыми коллекциями - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть две коллекции в моей базе данных mongodb:

employee_details с приблизительно 330000 документами, в которых Department_id как справка из коллекции отделов

отделов коллекции с 2 полями _id и имя_экспорта

Я хочу объединить две вышеупомянутые коллекции, используя Department_id в качестве внешнего ключа, используя метод поиска. Объединение работает нормально, но выполнение запроса mon go занимает много времени, когда я добавляю сортировку.

Примечание: выполнение выполняется быстро, если я удаляю объект сортировки или если я удаляю метод поиска.

Я сослался на несколько постов в разных блогах и SO, но ни один из них не дал решения с сортировкой.

Мой запрос приведен ниже:

db.getCollection("employee_details").aggregate([
  {
    $lookup: {
      from: "departments",
      localField: "department_id",
      foreignField: "_id",
      as: "Department"
    }
  },
  { $unwind: { path: "$Department", preserveNullAndEmptyArrays: true } },
  { $sort: { employee_fname: -1 } },
  { $limit: 10 }
]);

Может кто-то дал метод, чтобы заставить этот запрос работать без задержки, так как мой клиент не может скомпрометировать задержку производительности. Я надеюсь, что есть какой-то метод для исправления проблемы с производительностью, так как sql не предназначен для обработки большой базы данных.

Есть ли здесь какие-либо методы индексирования? чтобы я мог использовать его вместе со своей структурой коллекции.

Заранее спасибо.

1 Ответ

1 голос
/ 03 февраля 2020

В настоящее время поиск будет выполняться для каждого employee_details, что означает 330000 раз, но если мы сначала отсортируем и ограничим перед поиском, это будет только 10 раз. Это значительно уменьшит время запроса.

db.getCollection('employee_details').aggregate([
    {$sort      : {employee_fname: -1}},
    {$limit     :10},
    {
        $lookup : {
            from         : "departments",
            localField   : "department_id",
            foreignField : "_id",
            as           : "Department"
        }
    },
    { $unwind   : { path: "$Department", preserveNullAndEmptyArrays: true }},
]) 

Если вы попробуете это, даже если вы захотите уменьшить время отклика, вы можете определить index в поле сортировки.

db.employee_details.createIndex( { employee_fname: -1 } )
...