<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%2F%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_5</id>
	<title>Базы данных/Лабораторная работа 5 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%2F%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_5"/>
	<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_5&amp;action=history"/>
	<updated>2026-06-06T22:24:58Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wikicshse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_5&amp;diff=1985&amp;oldid=prev</id>
		<title>imported&gt;Ivsavin: Migrated current public revision from wiki.cs.hse.ru</title>
		<link rel="alternate" type="text/html" href="https://wikicshse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_5&amp;diff=1985&amp;oldid=prev"/>
		<updated>2016-06-10T08:41:23Z</updated>

		<summary type="html">&lt;p&gt;Migrated current public revision from wiki.cs.hse.ru&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Задачи лабораторной работы:&lt;br /&gt;
* Установить MongoDB&lt;br /&gt;
* Рассмотреть различия в моделировании данных для реляционных БД и документоориентированных.&lt;br /&gt;
* Попрактиковаться в составлении запросов к MongoDB: добавление, обновление, селекция, фильтрация, агрегация.&lt;br /&gt;
* Настроить репликацию данных, инициировать отключение мастер-узла в процессе интенсивного обновления данных, проанализировать действия сервера и проверить целостность измененных данных.&lt;br /&gt;
&lt;br /&gt;
== Установка MongoDB ==&lt;br /&gt;
&lt;br /&gt;
Для лабораторных работ достаточно версии 2.4+&lt;br /&gt;
&lt;br /&gt;
* Ubuntu: sudo apt-get install mongodb&lt;br /&gt;
* Mac OS: brew install mongodb [http://www.mongodbspain.com/en/2014/11/06/install-mongodb-on-mac-os-x-yosemite/ Подробнее]&lt;br /&gt;
* Windows: Скачать установщик: https://www.mongodb.com/download-center#community&lt;br /&gt;
&lt;br /&gt;
Удобная IDE для работы с MongoDB:&lt;br /&gt;
* https://robomongo.org/&lt;br /&gt;
&lt;br /&gt;
== Импорт данных ==&lt;br /&gt;
Коллекции, содержащие фильмы и длинные текстовые факты о фильмах:&lt;br /&gt;
* https://yadi.sk/d/Y7r672PvsEyaC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ссылки на отдельные файлы:&lt;br /&gt;
* https://yadi.sk/d/_UIdFUhhsF8SC&lt;br /&gt;
* https://yadi.sk/d/sSuDjY3fsF8S7&lt;br /&gt;
&lt;br /&gt;
Для импорта коллекций в базу movies выполните:&lt;br /&gt;
&lt;br /&gt;
  bzip2 -dc movies.bson.bz2 | mongoimport -d movies -c Movie&lt;br /&gt;
  bzip2 -dc moviesdocs.bson.bz2 | mongoimport -d movies -c MovieDoc&lt;br /&gt;
&lt;br /&gt;
Импортированная коллекция займет примерно &amp;#039;&amp;#039;&amp;#039;6Гб&amp;#039;&amp;#039;&amp;#039; на диске.&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить корректность импорта, зайдите в консоль MongoDB:&lt;br /&gt;
&lt;br /&gt;
  mongo&lt;br /&gt;
&lt;br /&gt;
Показать базы данных:&lt;br /&gt;
&lt;br /&gt;
  show dbs;&lt;br /&gt;
&lt;br /&gt;
Переключиться на базу данных (если ее нет, то создастся):&lt;br /&gt;
&lt;br /&gt;
  use movies&lt;br /&gt;
&lt;br /&gt;
Показать коллекции текущей базы данных:&lt;br /&gt;
&lt;br /&gt;
  show collections;&lt;br /&gt;
&lt;br /&gt;
== Экспорт данных ==&lt;br /&gt;
&lt;br /&gt;
В случае, если понадобится экспортировать данные, то сделать это можно (для версий 2.*) по коллекциям, запуская:&lt;br /&gt;
&lt;br /&gt;
  mongoexport --db movies -c MovieDoc -o - | bzip2 - &amp;gt; moviesdocs.bson.bz2&lt;br /&gt;
  mongoexport --db movies -c Movie -o - | bzip2 - &amp;gt; movies.bson.bz2&lt;br /&gt;
&lt;br /&gt;
Если вы создадите индексы, то они будут лежать в отдельной коллекции, ее также нужно экспортировать.&lt;br /&gt;
&lt;br /&gt;
== Моделирование данных в MongoDB ==&lt;br /&gt;
Так как MongoDB не стремится экономить место на диске, а наоборот активно резервирует место под обновления данных, итоговая база занимает более 30Гб. В данной лабораторной работе рассматривается только сущность фильмов и связанные с ней факты (информация аналогичная хранимой в title, movie_info, keywords).&lt;br /&gt;
&lt;br /&gt;
Схема модели данных в MongoDB:&lt;br /&gt;
&lt;br /&gt;
https://www.packtpub.com/sites/default/files/new_blog_images/147/1-flatmodel.gif&lt;br /&gt;
&lt;br /&gt;
В дампе базы есть коллекции: &lt;br /&gt;
* Movie - для заголовков фильмов, ключевых слов и некоторых фактов&lt;br /&gt;
* MovieDoc - для длинных текстовых фактов (описания, цитаты и тд)&lt;br /&gt;
&lt;br /&gt;
=== Коллекция Movie ===&lt;br /&gt;
&lt;br /&gt;
Это основная коллекция, ключом в которой является отформатированная строка, состоящая из: названия фильма, года выпуска, названия эпизода (для сериалов). Пример поиска сериала и эпизода по ключу:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.find({&amp;quot;_id&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005)&amp;quot;})  // выбрать сериал или фильм &lt;br /&gt;
  db.Movie.find({&amp;quot;SeriesID&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005)&amp;quot;}) // выбрать сериал и все эпизоды &lt;br /&gt;
  db.Movie.find({&amp;quot;_id&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005) {Adventure Mouse (#1.7)}&amp;quot;})  // выбрать конкретный эпизод&lt;br /&gt;
&lt;br /&gt;
Для удобства восприятия информации используйте .pretty():&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; db.Movie.find({&amp;quot;_id&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005)&amp;quot;}).pretty()&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;AltTitles&amp;quot; : [&lt;br /&gt;
        &amp;quot;\&amp;quot;12 Ouns Mouce\&amp;quot; (2005)&amp;quot;,&lt;br /&gt;
        &amp;quot;\&amp;quot;Oz. Mo\&amp;quot; (2005)&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;Countries&amp;quot; : [&lt;br /&gt;
        &amp;quot;USA&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;Genres&amp;quot; : [&lt;br /&gt;
        &amp;quot;Animation&amp;quot;,&lt;br /&gt;
        &amp;quot;Comedy&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;Keywords&amp;quot; : [&lt;br /&gt;
        &amp;quot;abbreviation-in-title&amp;quot;,&lt;br /&gt;
        &amp;quot;absurdism&amp;quot;,&lt;br /&gt;
        &amp;quot;adult-animation&amp;quot;,&lt;br /&gt;
        &amp;quot;animal-in-title&amp;quot;,&lt;br /&gt;
        &amp;quot;avant-garde&amp;quot;,&lt;br /&gt;
        &amp;quot;beer&amp;quot;,&lt;br /&gt;
        &amp;quot;character-name-in-title&amp;quot;,&lt;br /&gt;
        &amp;quot;digit-in-title&amp;quot;,&lt;br /&gt;
        &amp;quot;drunkenness&amp;quot;,&lt;br /&gt;
        &amp;quot;late-night&amp;quot;,&lt;br /&gt;
        &amp;quot;mouse&amp;quot;,&lt;br /&gt;
        &amp;quot;non-sequitur&amp;quot;,&lt;br /&gt;
        &amp;quot;number-in-title&amp;quot;,&lt;br /&gt;
        &amp;quot;period-in-title&amp;quot;,&lt;br /&gt;
        &amp;quot;surrealism&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;Languages&amp;quot; : [&lt;br /&gt;
        &amp;quot;English&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;Locations&amp;quot; : [&lt;br /&gt;
        &amp;quot;Atlanta, Georgia, USA&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;MovieID&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005)&amp;quot;,&lt;br /&gt;
    &amp;quot;Parental&amp;quot; : {&lt;br /&gt;
        &amp;quot;Certificates&amp;quot; : [&lt;br /&gt;
            &amp;quot;Australia:MA15+&amp;quot;,&lt;br /&gt;
            &amp;quot;Canada:14+\t(TV rating)&amp;quot;,&lt;br /&gt;
            &amp;quot;New Zealand:M&amp;quot;,&lt;br /&gt;
            &amp;quot;USA:TV-14&amp;quot;,&lt;br /&gt;
            &amp;quot;USA:TV-MA\t(one episode)&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;Rating&amp;quot; : {&lt;br /&gt;
        &amp;quot;RatingDist&amp;quot; : &amp;quot;1000001103&amp;quot;,&lt;br /&gt;
        &amp;quot;Rating&amp;quot; : &amp;quot;6.9&amp;quot;,&lt;br /&gt;
        &amp;quot;RatingVotes&amp;quot; : &amp;quot;1365&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;ReleaseYear&amp;quot; : &amp;quot;2005&amp;quot;,&lt;br /&gt;
    &amp;quot;RunningTime&amp;quot; : &amp;quot;15&amp;quot;,&lt;br /&gt;
    &amp;quot;SeriesEndYear&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;SeriesID&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005)&amp;quot;,&lt;br /&gt;
    &amp;quot;SeriesType&amp;quot; : &amp;quot;S&amp;quot;,&lt;br /&gt;
    &amp;quot;Technical&amp;quot; : {&lt;br /&gt;
        &amp;quot;Colors&amp;quot; : [&lt;br /&gt;
            &amp;quot;Color&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;_id&amp;quot; : &amp;quot;\&amp;quot;12 oz. Mouse\&amp;quot; (2005)&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Расшифровка SeriesType: &lt;br /&gt;
* F - фильм&lt;br /&gt;
* S - сериал&lt;br /&gt;
* E - эпизод&lt;br /&gt;
&lt;br /&gt;
=== Индексы ===&lt;br /&gt;
&lt;br /&gt;
В предлагаемом дампе нет индексов (только первичный ключ _id), в ходе выполнения заданий они могут понадобиться.&lt;br /&gt;
&lt;br /&gt;
Просмотр существующих индексов в коллекции:&lt;br /&gt;
&lt;br /&gt;
  db.collection_name.getIndexes()&lt;br /&gt;
&lt;br /&gt;
Функция просмотра всех индексов для всех коллекций:&lt;br /&gt;
&lt;br /&gt;
  db.getCollectionNames().forEach(function(collection) {&lt;br /&gt;
     indexes = db[collection].getIndexes();&lt;br /&gt;
     print(&amp;quot;Indexes for &amp;quot; + collection + &amp;quot;:&amp;quot;);&lt;br /&gt;
     printjson(indexes);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
Создание индексов:&lt;br /&gt;
&lt;br /&gt;
  db.collection_name.createIndex( { field_name: 1 } )&lt;br /&gt;
  db.collection_name.createIndex( { field_name: &amp;quot;hashed&amp;quot; } )  // хэш-индексы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Подокументное преобразование данных ===&lt;br /&gt;
&lt;br /&gt;
Недостатком предлагаемой базы является то, что все атрибуты фильмов по-прежнему строковые, хотя некоторые, например RunningTime или Rating.RatingVotes содержат только числа. Это часто встречаемая ситуация, поэтому далее рассматривается пример функции, которая помогает выполнять подобные преобразования.&lt;br /&gt;
&lt;br /&gt;
Конвертировать продолжительность фильма (задана для всех):&lt;br /&gt;
  db.Movie.find().forEach(function(data) {&lt;br /&gt;
     db.Movie.update({&lt;br /&gt;
         &amp;quot;_id&amp;quot;: data._id&lt;br /&gt;
     }, {&lt;br /&gt;
         &amp;quot;$set&amp;quot;: {&lt;br /&gt;
             &amp;quot;RunningTime&amp;quot;: parseInt(data.RunningTime)&lt;br /&gt;
         }&lt;br /&gt;
     });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Конвертировать рейтинг там, где он задан:&lt;br /&gt;
 &lt;br /&gt;
  db.Movie.find({&amp;quot;Rating.Rating&amp;quot;: {$exists: true}, &amp;quot;Rating.RatingVotes&amp;quot;: {$exists: true}}).forEach(function(data) {&lt;br /&gt;
    db.Movie.update({&lt;br /&gt;
        &amp;quot;_id&amp;quot;: data._id&lt;br /&gt;
    }, {&lt;br /&gt;
        &amp;quot;$set&amp;quot;: {&lt;br /&gt;
            &amp;quot;Rating.Rating&amp;quot;: parseFloat(data.Rating.Rating),&lt;br /&gt;
            &amp;quot;Rating.RatingVotes&amp;quot;: parseInt(data.Rating.RatingVotes)&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задание:&amp;#039;&amp;#039;&amp;#039; Попробуйте добавить фильмам атрибут &amp;quot;длина названия&amp;quot;, его нельзя вычислить с помощью обычной команды find, но можно сохранить эту информацию заранее. И также попробуйте преобразовать годы выхода сериалов для тех записей, где они указаны.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительно ===&lt;br /&gt;
* Подробное описание скрипта и модели данных: https://www.packtpub.com/books/content/mongo-goes-to-the-movies&lt;br /&gt;
&lt;br /&gt;
== Язык запросов MongoDB ==&lt;br /&gt;
&lt;br /&gt;
=== Базовые операции ===&lt;br /&gt;
&lt;br /&gt;
==== Выборка ====&lt;br /&gt;
&lt;br /&gt;
Поиск по текстовым полям поддерживает синтаксис регулярных выражений, для нечеткого поиска нужно заключить выражение в /title/ (аналог &amp;quot;%title%&amp;quot;). Пример:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.find({&amp;quot;MovieID&amp;quot;: /Matrix.*1999/})&lt;br /&gt;
&lt;br /&gt;
Чтобы вывести только нужные поля, используйте второй параметр функции find:&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; db.Movie.find({&amp;quot;_id&amp;quot; : &amp;quot;The Matrix (1999)&amp;quot;}, {Genres: 1, Business: 1}).pretty()&lt;br /&gt;
&lt;br /&gt;
Поиск по значениям в списках не отличается от обычного:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.find({&amp;quot;Genres&amp;quot;: &amp;quot;Action&amp;quot;}).limit(3)&lt;br /&gt;
&lt;br /&gt;
==== Обновление ====&lt;br /&gt;
&lt;br /&gt;
Добавить новый документ:&lt;br /&gt;
  db.Movie.insert({_id: &amp;quot;\&amp;quot;How I am getting 10 for db exam\&amp;quot; (2016)&amp;quot;, &lt;br /&gt;
    &amp;quot;MovieID&amp;quot; : &amp;quot;\&amp;quot;How I am getting 10 for db exam\&amp;quot; (2016)&amp;quot;, &lt;br /&gt;
    &amp;quot;Countries&amp;quot; : [ &amp;quot;Russia&amp;quot; ], &amp;quot;Genres&amp;quot; : [ &amp;quot;Drama&amp;quot;, &amp;quot;Comedy&amp;quot; ], &lt;br /&gt;
    &amp;quot;Keywords&amp;quot;: [ &amp;quot;study&amp;quot;, &amp;quot;working-hard&amp;quot;, &amp;quot;success&amp;quot; ], &amp;quot;ReleaseYear&amp;quot; : 2016})&lt;br /&gt;
&lt;br /&gt;
  db.Movie.insert({_id: &amp;quot;\&amp;quot;How I am getting 10 for project\&amp;quot; (2016)&amp;quot;, &amp;quot;MovieID&amp;quot; : &lt;br /&gt;
     &amp;quot;\&amp;quot;How I am getting 10 for db exam\&amp;quot; (2016)&amp;quot;, &lt;br /&gt;
     &amp;quot;Countries&amp;quot; : [ &amp;quot;Russia&amp;quot; ], &amp;quot;Genres&amp;quot; : [ &amp;quot;Drama&amp;quot;, &amp;quot;Comedy&amp;quot; ], &lt;br /&gt;
     &amp;quot;Keywords&amp;quot;: [ &amp;quot;study&amp;quot;, &amp;quot;working-hard&amp;quot;, &amp;quot;success&amp;quot; ], &amp;quot;ReleaseYear&amp;quot; : 2016})&lt;br /&gt;
&lt;br /&gt;
Обновить атрибут для всех документов по результатам поиска:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.update({MovieID: /How I am getting 10 for/}, {$set: {&amp;quot;Locations&amp;quot; : [ &amp;quot;Moscow, Russia&amp;quot; ]}}, multi=true)&lt;br /&gt;
&lt;br /&gt;
* Первый аргумент - условия выборки обновляемых объектов&lt;br /&gt;
* Второй аргумент - что именно делать&lt;br /&gt;
* multi=true (по умолчанию false), обновляет все найденные объекты или только первый&lt;br /&gt;
&lt;br /&gt;
Добавить элемент в список документа:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.update({MovieID: /How I am getting 10 for/}, {$push: {&amp;quot;Keywords&amp;quot;: &amp;quot;true-story&amp;quot;}}, multi=true)&lt;br /&gt;
&lt;br /&gt;
==== Дополнительно ====&lt;br /&gt;
* https://docs.mongodb.com/manual/crud/&lt;br /&gt;
&lt;br /&gt;
=== Aggregation Framework ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения агрегирующих запросов в MongoDB используется команда aggregate.&lt;br /&gt;
&lt;br /&gt;
Сама агрегация выглядит как pipeline для данных, проходя через шаги, данные преобразуются (группируются, фильтруются и тд) в зависимости от команды этого шага. Пример:&lt;br /&gt;
&lt;br /&gt;
https://docs.mongodb.com/manual/_images/aggregation-pipeline.png&lt;br /&gt;
&lt;br /&gt;
Также можно разгруппировать списки в документах ($unwind).&lt;br /&gt;
&lt;br /&gt;
Чтобы отделять переменные внутри шагов от строк используется префикс $.&lt;br /&gt;
&lt;br /&gt;
Найти документы и разгруппировать ($unwind) их по ключевым словам:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.aggregate({$match: {MovieID: /How I am getting 10 for/}}, &lt;br /&gt;
    {$unwind: &amp;quot;$Keywords&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Переформировать список выбираемых атрибутов ($project) аналогично второму параметру в find:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.aggregate({$match: {MovieID: /How I am getting 10 for/}}, &lt;br /&gt;
    {$project: {&amp;quot;MovieID&amp;quot;: 1, &amp;quot;Keywords&amp;quot;: 1, &amp;quot;_id&amp;quot;: 0} }, &lt;br /&gt;
    {$unwind: &amp;quot;$Keywords&amp;quot;})&lt;br /&gt;
&lt;br /&gt;
Сгруппировать по атрибуту и применить агрегирующую функцию:&lt;br /&gt;
&lt;br /&gt;
  db.Movie.aggregate({$match: {MovieID: /How I am getting 10 for/}}, &lt;br /&gt;
    {$project: {&amp;quot;MovieID&amp;quot;: 1, &amp;quot;Keywords&amp;quot;: 1, &amp;quot;_id&amp;quot;: 0} }, &lt;br /&gt;
    {$unwind: &amp;quot;$Keywords&amp;quot;}, &lt;br /&gt;
    {$group: {_id: &amp;quot;$Keywords&amp;quot;, &amp;quot;MoviesList&amp;quot;: {$push: &amp;quot;$MovieID&amp;quot;} }})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительно ====&lt;br /&gt;
* https://docs.mongodb.com/manual/aggregation/&lt;br /&gt;
&lt;br /&gt;
== Репликации MongoDB (необязательное) ==&lt;br /&gt;
&lt;br /&gt;
=== Принцип работы репликаций в MongoDB ===&lt;br /&gt;
&lt;br /&gt;
=== Конфигурация набора реплик ===&lt;br /&gt;
&lt;br /&gt;
=== Сценарий отказа мастер-узла ===&lt;br /&gt;
&lt;br /&gt;
=== Стартовый скрипт инициализации сбоя во время работы ===&lt;br /&gt;
&lt;br /&gt;
=== Дополнительно ===&lt;br /&gt;
* https://docs.mongodb.com/manual/core/replication-introduction/&lt;br /&gt;
&lt;br /&gt;
== Задания на защиту ==&lt;br /&gt;
1. Составить запросы: &lt;br /&gt;
* Для каждого года из первой декады XXI века посчитать количество снятых фильмов.&lt;br /&gt;
* Выбрать топ-10 наиболее популярных ключевых слов для фильмов заданной страны.&lt;br /&gt;
&lt;br /&gt;
2. Составить свою формулу рейтинга (общего для всех фильмов или по какому-либо фильтру), используя параметры словарей Movie.Rating (Rating - среднее значение оценкой, RatingVotes - количество оценок) или любые другие.&lt;br /&gt;
&lt;br /&gt;
Для примера вот формула [http://www.imdb.com/chart/top Top 250 IMDb Movies]&lt;br /&gt;
&lt;br /&gt;
  ранг фильма = (v/(v+k))*X + (k/(v+k))*C&lt;br /&gt;
  &lt;br /&gt;
  где:&lt;br /&gt;
  &lt;br /&gt;
    X = рейтинг фильма&lt;br /&gt;
    v = количество голосов&lt;br /&gt;
    k = минимальное количество голосов, чтобы попасть в список (для данного списка 25000)&lt;br /&gt;
    C = средний рейтинг для всех фильмов в этом списке (для данного списка 6.90)&lt;br /&gt;
&lt;br /&gt;
MongoDB поддерживает многие арифметические операции: https://docs.mongodb.com/manual/reference/operator/aggregation-arithmetic/&lt;br /&gt;
&lt;br /&gt;
Данное задание можно выполнить не одним запросом через агрегацию, а используя функцию на JavaScript, которая выполняется в консоле MongoDB.&lt;br /&gt;
&lt;br /&gt;
3. (&amp;#039;&amp;#039;&amp;#039;необязательное&amp;#039;&amp;#039;&amp;#039;) Написать скрипт на bash или любом другом скриптовом языке, который запускает сервер MongoDB в режиме реплики, начинает интенсивно изменять данные, определяет мастер-узел, убивает процесс мастер-узла, после этого заканчивает изменения данных и проверяет целостность данных.&lt;br /&gt;
&lt;br /&gt;
=== Защита лабораторной работы ===&lt;br /&gt;
* Показать и выполнить запросы с агрегацией, объяснить структуру запросов&lt;br /&gt;
* Продемонстрировать работу скрипта инициализации сбоя во время работы и объяснить, что происходит с репликами MongoDB&lt;/div&gt;</summary>
		<author><name>imported&gt;Ivsavin</name></author>
	</entry>
</feed>