Mongodb: $ group после $ lookup ошибка времени ожидания выхода - PullRequest
1 голос
/ 02 мая 2020

Для упрощения вопроса. В основном у меня есть две таблицы. Один из них - ревизия, а другой - бот.
Основная структура коллекции ревизий:

user: <username>
timestamp: <ISODate>

Коллекция ботов содержит список имен ботов:

name: <botname>

Если одна ревизия пользователь находится в коллекции ботов, то это ревизия ботов.

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

Проблема:

Сначала я попытался использовать '$lookup', чтобы найти всех пользователей бота, затем '$group'.

Однако эти два конвейера могут работать отдельно, но не работать вместе.

Здесь, когда они выполняются вместе, возникает ошибка тайм-аута. Two pipelines execute together Когда они запускаются отдельно, все работает нормально. enter image description here

Я не могу понять, что происходит. Есть предложения?

1 Ответ

0 голосов
/ 02 мая 2020

На самом деле вы можете использовать robo3T для доступа к MongoDB, что иногда удобнее, когда вы можете выполнять запросы, как показано ниже, так же, как в оболочке mon go. Не уверен, почему вы делаете _id : '$year', но это должно быть _id: { $year: "$timestamp" }. Попробуйте запрос агрегации ниже:

db.revisions.aggregate([
    {
      $lookup: {
        from: "bots",
        localField: "user",
        foreignField: "name",
        as: "bot"
      }
    },
    {
      $group: {
        _id: { $year: "$timestamp" }, // get year from `timestamp` field
        regularUser: { $sum: { $cond: [ { $size: "$bot" }, 0, 1 ] } },
        botUser: { $sum: { $cond: [ { $size: "$bot" }, 1, 0 ] } }
      }
    }
  ])

Тест: mongoplayground

Примечание: Не забудьте сохранить индексы на обе коллекции, по крайней мере на user & name полях.

...