Помощь в агрегации запросов - PullRequest
0 голосов
/ 30 апреля 2018

Я испытываю трудности с составлением сложного (для меня) запроса агрегации для моих данных. В общем, вот и все, так что все понимают мою головоломку.

У меня есть две коллекции в этом уравнении. « training_documents » и « users ». Каждый объект пользователя имеет ключ, идентифицируемый по имени " trainings ", который является массивом объектов. Каждый объект в этом массиве тренировок содержит 4 пары ключ / значение. Пример каждого объекта приведен ниже.

{
    "document": ObjectId('5a0350ad7df0977d94cffab6'),
    "trainee": ObjectId('59e51a4b7df0977d94cff95d'),
    "trainer": ObjectId('595fcc2e04cf707693257890'),
    "completion_time": "2018-04-23T21:28:22.747Z"
}

Массив пользователей trainings будет содержать много объектов в соответствии с вышеупомянутым форматом.

Пример структуры пользовательских данных приведен ниже для справки.

[
    {
        "_id": "5ad782283c55b056bcc39e3z",
        "site": {
            "site_id": "site1",
            "site_name": "Site One"
        },
        "user_name": "jsmith",
        "first_name": "John",
        "middle_name": "A",
        "last_name": "Smith",
        "full_name": "John Smith",
        "title": "Duh Boss...",
        "email": "testuser@example.com",
        "last_login": "2018-04-27T14:27:27.014Z",
        "type": "full-time",
        "active": true,
        "__v": 0,
        "badge_id": "000001780343232123",
        "trainings": [
            {
                "document": ObjectId('5ae33622a766885a121b7362'),
                "trainee": ObjectId('5ad782283c55b056bcc39e30'),
                "trainer": ObjectId('595fcc2e04cf707693257890'),
                "completion_time": "2018-04-23T17:40:41.198Z"
            },
            {
                "document": ObjectId('5a0350ad7df0977d94cffab6'),
                "trainee": ObjectId('59e51a4b7df0977d94cff95d'),
                "trainer": ObjectId('595fcc2e04cf707693257890'),
                "completion_time": "2018-04-23T21:28:22.747Z"
            }
        ],
    }
]

Мне нужно перебирать каждый объект в массиве пользователей trainings во время агрегации. В основном мне нужно $lookup данные, используя ключ _id " document " " стажер " & " trainer " из training_documents, users , & users соответственно, сохраняя их каждый в своих объектах / структуре.

Я уже пытался составить запрос, но не смог выяснить часть итерации.

UserLdap.aggregate([
    { $lookup: {
        from: 'training_documents',           // Search training documents collection...
        localField: 'trainings.document',     // Search query is the object id of trainings array.
        foreignField: '_id',                  // key to compare against is _id of trainings[].document.
        as: 'trainings.document'              // Return results in the trainings array on user.
        },
    },
]).exec((err, results) => {
    if (err) {
        console.log(err);
    }
    else {
        res.status(200).json(results);
        console.log(results);
    }
})

Может кто-нибудь подсказать мне, как составить этот запрос?

1 Ответ

0 голосов
/ 11 мая 2018

All

Видимо, это не легко, или, может быть, я настроил это странно. Хотя, пожалуй, лучший метод, я отказался от методологии агрегации. Я просто не мог понять, как реализовать какую-то forEach логику для каждого objectId в массиве тренировок.

Вместо этого, когда администратор нажимает на детали обучения профиля пользователя, выполняется GET. Шаги того, что я делаю вместо совокупности, ниже.

  1. Идентификатор объекта пользователя сначала отправляется на маршрут к серверу.
  2. Используя пользователя objectId, я findOne в моей коллекции БД.
  3. Найдя, я устанавливаю новый пустой массив и запускаю forEach в массиве пользовательских тренировок.
  4. В forEach я устанавливаю новый пустой объект.
  5. Я настроил два обещания с findOne логикой в ​​каждом. Один для документа objectId и один для тренера ObjectId. Если я получу данные обратно, я решу с данными, полученными для каждого.
  6. Я выполняю обещания и, используя .then(), беру данные и затем настраиваю свойства объекта пустого объекта, который я создал ранее.
  7. Как только все необходимые свойства выполнены, я затем помещаю новый объект в новый пустой массив, который я создал ранее.
  8. После того, как все это завершено, я отправляю обратно статус 200 и вновь созданный массив клиенту. Там я наконец могу просмотреть пройденные тренировки пользователей и при необходимости экспортировать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...