Статьи

Как обогатить данные с помощью MongoDB Stitch

Эта статья была первоначально опубликована на MongoDB . Спасибо за поддержку партнеров, которые делают возможным использование SitePoint.

Вот что мы собираемся достичь в этом уроке:

Во-первых, мы собираемся написать документ в MongoDB с помощью MongoDB Stitch .

Результат в нашей коллекции MongoDB будет выглядеть так:

{
"_id": ObjectId("5bb27712dced5f37bebf388c"),
"Title":"Guardians of the Galaxy"
}

Во-вторых, триггер перехватит эту новую вставку и запустит функцию.

Наконец, эта функция будет вызывать внешний API OMDB с заданным названием фильма, извлекать данные об этом фильме и, наконец, обогащать наш документ MongoDB данными, которые мы собрали из этого API.

Это конечный результат, который мы ожидаем в нашей коллекции MongoDB:

 {  
   "_id": ObjectId("5bb27712dced5f37bebf388c"),
   "Title":"Guardians of the Galaxy",
   "Year":"2014",
   "Rated":"PG-13",
   "Released":"01 Aug 2014",
   "Runtime":"121 min",
   "Genre":"Action, Adventure, Comedy",
   "Director":"James Gunn",
   "Writer":"James Gunn, Nicole Perlman, Dan Abnett (based on the Marvel comics by), Andy Lanning (based on the Marvel comics by), Bill Mantlo (character created by: Rocket Raccoon), Keith Giffen (character created by: Rocket Raccoon), Jim Starlin (characters created by: Drax the Destroyer,  Gamora & Thanos), Steve Englehart (character created by: Star-Lord), Steve Gan (character created by: Star-Lord), Steve Gerber (character created by: Howard the Duck), Val Mayerik (character created by: Howard the Duck)",
   "Actors":"Chris Pratt, Zoe Saldana, Dave Bautista, Vin Diesel",
   "Plot":"A group of intergalactic criminals are forced to work together to stop a fanatical warrior from taking control of the universe.",
   "Language":"English",
   "Country":"USA",
   "Awards":"Nominated for 2 Oscars. Another 52 wins & 99 nominations.",
   "Poster":"https://m.media-amazon.com/images/M/MV5BMTAwMjU5OTgxNjZeQTJeQWpwZ15BbWU4MDUxNDYxODEx._V1_SX300.jpg",
   "Ratings":[  
      {  
         "Source":"Internet Movie Database",
         "Value":"8.1/10"
      },
      {  
         "Source":"Rotten Tomatoes",
         "Value":"91%"
      },
      {  
         "Source":"Metacritic",
         "Value":"76/100"
      }
   ],
   "Metascore":"76",
   "imdbRating":"8.1",
   "imdbVotes":"871,949",
   "imdbID":"tt2015381",
   "Type":"movie",
   "DVD":"09 Dec 2014",
   "BoxOffice":"$270,592,504",
   "Production":"Walt Disney Pictures",
   "Website":"http://marvel.com/guardians",
   "Response":"True"
}

Предпосылки

Итак, прежде всего, если вы хотите попробовать это дома, это очень легко. Единственное требование здесь — создать бесплатный кластер MongoDB Atlas . Это видео покажет вам шаги.

MongoDB Stitch — это наша серверная платформа, созданная MongoDB на основе MongoDB Atlas. Когда наш кластер MongoDB Atlas будет готов к использованию, свяжите с ним приложение MongoDB Stitch:

  • Нажмите на левую панель «Stitch Apps»,

  • Затем нажмите «Создать новое приложение»,

  • Выберите имя, которое вы хотите для своего приложения,

  • Свяжите его с вашим бесплатным кластером MongoDB Atlas.

действия

Чтобы иметь возможность отправить документ в MongoDB, мы будем использовать службу HTTP POST.

  • На левой панели нажмите «Услуги»,
  • Затем нажмите «Добавить услугу»,
  • Выберите название услуги «IMDB»,

Примечание: «IMDB» будет повторно использован позже в коде функции. Если вы выбираете другое имя, пожалуйста, обновите код соответствующим образом.

  • Нажмите «Добавить сервис»,

  • Нажмите «Добавить входящий веб-крючок»,

  • И скопируйте скриншот ниже.

Когда это будет сделано, нажмите кнопку «Сохранить», и вы попадете на экран «Редактор функций».

Введите следующий код:

 exports = function(payload, response) {
  const mongodb = context.services.get("mongodb-atlas");
  const movies = mongodb.db("stitch").collection("movies");
  var body = EJSON.parse(payload.body.text());
  movies.insertOne(body)
  .then(result => {
    response.setStatusCode(201);
  });
};

Нажмите кнопку «Сохранить» еще раз.

Теперь, когда наш Сервис готов, мы можем его протестировать!

Перейдите в «Настройки», и вы найдете URL своего Webhook. Теперь вы можете отправить HTTP-запрос POST, например, в MongoDB Stitch:

 curl -H "Content-Type: application/json" -d '{"Title":"Guardians of the Galaxy"}' https://webhooks.mongodb-stitch.com/api/client/v2.0/app/stitchtapp-abcde/service/IMDB/incoming_webhook/post_movie_title?secret=test

Примечание: я использовал команду curl, но не стесняйтесь использовать Postman или то, к чему вы привыкли.

Мы можем проверить его работоспособность, взглянув на содержимое коллекции stitch.movies в нашем кластере MongoDB Atlas:

Теперь, когда мы можем вставить новый документ в MongoDB Atlas с помощью Stitch, мы собираемся создать триггер.

  • На левой панели нажмите «Триггеры»,

  • Затем нажмите «Добавить триггер базы данных»,

  • И делай как следует.

Это код, который вам понадобится для создания новой функции:

 exports = function(changeEvent) {
  var docId = changeEvent.documentKey.\_id;
  var title = encodeURIComponent(changeEvent.fullDocument.Title.trim());

  var movies = context.services.get("mongodb-atlas").db("stitch").collection("movies");
  var imdb\_url = "http://www.omdbapi.com/?apikey=a12b1234&t=" + title;

  const http = context.services.get("IMDB"); // change the name of the service here if you used a different name.
    return http
      .get({ url: imdb\_url })
      .then(resp => {
        var doc = EJSON.parse(resp.body.text());
        movies.updateOne({"\_id":docId}, doc);
        });
};

Как вы можете видеть в середине кода, я использую OMDB API и заменил ключ API на фальшивый.

Вы можете создать свой собственный бесплатный API-ключ здесь, указав только действующий адрес электронной почты: http://www.omdbapi.com/apikey.aspx — с ограничением до 1000 вызовов в день.

Как только это будет сделано, вы можете просто заменить мой поддельный ключ API (выделенный желтым цветом) своим собственным ключом.

Теперь, когда все готово, нам просто нужно проверить его, повторив ту же команду CURL, которую мы использовали ранее. Не стесняйтесь использовать другой заголовок фильма, если вы думаете о лучшем ;-).

Я удалил предыдущий тест, который мы сделали перед добавлением триггера, и теперь это то, что у меня есть в моей коллекции:

Давайте на секунду рассмотрим, что мы сделали:

  • Мы вставили новый документ с использованием службы HTTP POST, размещенной в MongoDB Stitch, содержащей только «_id» (автоматически заполняемый MongoDB) и «Заголовок».
  • Вставка этого документа обнаруживается триггером, который вызывает внешний веб-API, используя этот «Заголовок» в качестве параметра.
  • Затем мы анализируем тело результата, полученного от этого API, и обновляем документ, который мы вставили несколько миллисекунд назад.

Вывод

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

Следующие шаги

Спасибо, что нашли время, чтобы прочитать мой пост. Я надеюсь, что вы нашли это полезным и интересным.

Если MongoDB Stitch — это то, что вы рассматриваете в производстве, вы можете узнать здесь, как работает биллинг .

Если вы хотите запросить данные, хранящиеся в MongoDB Atlas, с помощью MongoDB Stitch, я рекомендую эту статью от Michael Lynn .