Агрегация Монго для вычисления уникальных идентификаторов в возвращенных документах медленная - PullRequest
0 голосов
/ 27 июня 2018

Помимо возврата отфильтрованного набора документов конечному пользователю через представление Mongo, у меня также есть пара функций, выполняющихся для генерации промежуточных итогов. По какой-то причине, хотя моя find() операция действительно быстрая (225 мс), эта дополнительная агрегация, которую я выполняю, занимает более 6 секунд, что замедляет всю конечную точку, потому что эти данные передаются в том, что я ' м возвращаюсь.

Я пытаюсь понять, почему эта агрегация будет такой медленной? Эта агрегация соответствует фильтрам, переданным конечным пользователем, и затем вычисляет количество уникальных идентификаторов клиентов, которые появляются в возвращенных документах. Вот как это выглядит:

  let totalCustomers = await db
    .collection("view_accounts_report")
    .aggregate([{
        $match: search
      },
      {
        $group: {
          _id: null,
          customers: {
            $addToSet: "$customer._id"
          }
        }
      },
      {
        $project: {
          uniqueCustomers: {
            $size: "$customers"
          }
        }
      }
    ])
    .next();

Почему это займет 6 секунд? Есть идеи? Любые советы о том, как я могу ускорить это?

1 Ответ

0 голосов
/ 27 июня 2018

Ну, это определенно займет некоторое время, если будет много разных пользователей (или вообще много пользователей). Если вы хотите проверить, почему это занимает так много времени, попробуйте аргумент explain .

С другой стороны, distinct может быть лучшим выбором здесь:

let customers = await db.collection('view_accounts_report').distinct(search);
let totalCustomers = customers.length;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...