Как объединить два массива со значением сравнения - Google Analytics & MongoDB - PullRequest
1 голос
/ 27 января 2020

Стек, эта работа сводит меня с ума. Чем я занимаюсь? Я использую Google Analytics NodeJS SDK, чтобы получить наиболее посещаемые страницы моего сайта. Я позволил Google предоставить мне удобные URL-адреса (слагы) для поиска в базе данных MongoDB. Поэтому я сохраняю три слагаемых наиболее посещаемых страниц в массиве, а затем запускаю обычную функцию MongoDB Recording.find({slug: searchArr}. Результаты Аналитики доступны в result.data.rows.

google.analytics('v3').data.ga.get(
  {
    auth: jwt,
    ids: 'ga:' + view_id,
    'start-date': '30daysAgo',
    'end-date': 'today',
    metrics: 'ga:uniquePageviews',
    dimensions: 'ga:pagePath',
    sort: '-ga:uniquePageviews',
    filters: 'ga:pagePath=~/recordings/',
    'max-results': '3'
  },
  (err, result) => {
    if (err) {
      Sentry.captureException(err);
      res.json({ success: false, message: 'An error occurred.' });
    } else {
      let mostViewedFirst = {
        slug: result.data.rows[0][0].replace('/recordings/', ''),
        views: result.data.rows[0][1]
      };
      const mostViewedSecond = {
        slug: result.data.rows[1][0].replace('/recordings/', ''),
        views: result.data.rows[1][1]
      };
      const mostViewedThird = {
        slug: result.data.rows[2][0].replace('/recordings/', ''),
        views: result.data.rows[2][1]
      };
      let searchArr = [mostViewedFirst.slug, mostViewedSecond.slug, mostViewedThird.slug];
      let concatArr = [
        {
          slug: mostViewedFirst.slug,
          views: mostViewedFirst.views
        }, {
          slug: mostViewedSecond.slug,
          views: mostViewedSecond.views
        }, {
          slug: mostViewedThird.slug,
          views: mostViewedThird.views
        }];
      Recording.find({slug: searchArr},
        (err, recording) => {
          if (err) {
            Sentry.captureException(err);
            res.json({ success: false, message: 'Most viewed recording could not be loaded.' });
          } else {
            res.json(recording.concat(concatArr));
          }
        }
      ).populate('genres')
        .populate('artists')
        .populate('show');
    }
  });

Ответ Google Analytics SDK:

  {
    "slug": "recording-a",
    "views": "148"
  },
  {
    "slug": "recording-b",
    "views": "75"
  },
  {
    "slug": "recording-c",
    "views": "68"
  }

Пн goose Ответ:

  {
    "slug": "recording-a",
    "title": "Recording A"
    ...
  },
  {
    "slug": "recording-b",
    "title": "Recording B"
    ...
  },
  {
    "slug": "recording-c",
    "title": "Recording C",
    ...
  }

На следующем шаге я хотел бы применить вывод массива Google к базе данных MongoDB. Значение «slug» должно совпадать, а «views» должны быть вставлены в соответствующий объект.

С res.json(recording.concat(concatArr)); я смог отобразить оба объекта в ответе JSON:

  {
    "slug": "recording-a",
    "views": "148"
  },
  {
    "slug": "recording-b",
    "views": "75"
  },
  {
    "slug": "recording-c",
    "views": "68"
  },
  {
    "slug": "recording-a",
    "title": "Recording A"
    ...
  },
  {
    "slug": "recording-b",
    "title": "Recording B"
    ...
  },
  {
    "slug": "recording-c",
    "title": "Recording C",
    ...
  }

Мой желаемый результат:

  {
    "slug": "recording-a",
    "title": "Recording A"
    "views": "148"
  },
  {
    "slug": "recording-b",
    "title": "Recording B"
    "views": "75"
  },
  {
    "slug": "recording-c",
    "title": "Recording C",
    "views": "68"
  }

К сожалению, я не могу получить массив значений Google Analytics из Google в MongoDB. Также возможно, что я написал очень сложный код - возможно, весь лог c можно упростить с помощью a для l oop. Я открыт для любой помощи, спасибо!

1 Ответ

1 голос
/ 28 января 2020

Попробуйте это:

var googleArray = [  {
    "slug": "recording-a",
    "views": "148"
  },
  {
    "slug": "recording-b",
    "views": "75"
  },
  {
    "slug": "recording-c",
    "views": "68"
  }];
  
var mongoArray = [  {
    "slug": "recording-a",
    "title": "Recording A"
  },
  {
    "slug": "recording-b",
    "title": "Recording B"
  },
  {
    "slug": "recording-c",
    "title": "Recording C"
  }];

// This is the important line:
var mergedArray = googleArray.map(x => Object.assign(x, mongoArray.find(y => y.id == x.id)));

// This is just for showing the output in this example:
alert(JSON.stringify(mergedArray, null, 2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...