Файл: Подготовка данных исследование, очистка.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 28

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа №2

Тема: Подготовка данных: исследование, очистка.

Цель работы: Сформировать у студентов навыки создания БД в MongoDB со стандартными операциями работы с данными.

План работы:

  1. Установка и администрирование базы данных

  2. Работа с данными

  3. Работа с данными в MongoDB Compass



  1. Установка и администрирование базы данных

Рассмотрим базовые операции с данными в MongoDB с примением консольной оболочки mongo, и графического клиента MongoDB Compass. Однако в любом случае при начале работы с сервером следует не забывать запускать сам сервер - то есть приложение mongod.

Начиная работать с MongoDB в консольной оболочке mongo, первым делом надо установить нужную нам базу данных в качестве текущей, чтобы затем ее использовать. Для этого надо использовать команду use, после которой идет название базы данных. При этом не важно, существует ли такая бд или нет. Если ее нет, то MongoDB автоматически создаст ее при добавлении в нее данных.

Итак, запустим консольную оболочку mongo.exe и введем там следующую команду:


Теперь в качестве текущей будет установлена БД test.

Если вы вдруг не уверены, а существует ли уже база данных с таким названием, то с помощью команды show dbs можно вывести названия всех имеющихся бд на консоль:


Для базы данных можно задать любое имя, однако есть некоторые ограничения. Например, в имени не должно быть символов /, \, ., ", *, <, >, :, |, ?, $. Кроме того, имена баз данных ограничены 64 байтами.

Также есть зарезервированные имена, которые нельзя использовать: local, admin, config. Эти имена представляют базы данных, которые уже имеют по умолчанию на сервере и предназначны для служебных целей.

Причем как вы видите, бд test в данном списке нет, так как я в нее еще не добавил данные.

Если мы хотим узнать, какая бд используется в текущей момент, то мы можем воспользоваться командой 
db:


Кроме баз данных мы можем просмотреть список всех коллекций в текущей бд с помощью команды show collections.

Получение статистики


Используя команду db.stats(), можно получить статистику по текущей базе данных. Например, у нас в качестве текущей установлена база данных test:


Похожим образом мы можем узнать всю статистику по отдельной коллекции. Например, узнаем статистику по коллекции users: db.users.stats()



  1. Работа с данными

Добавление данных

Установив бд, теперь мы можем добавить в нее данные. Все данные хранятся в бд в формате BSON, который близок к JSON, поэтому нам надо также вводить данные в этом формате. И хотя у нас, возможно, на данный момент нет ни одной коллекции, но при добавлении в нее данных она автоматически создается.

Как ранее говорилось, имя коллекции - произвольный идентификатор, состоящий из не более чем 128 различных алфавитно-цифровых символов и знака подчеркивания. В то же время имя коллекции не должно начинаться с префикса system., так как он зарезервирован для внутренних коллекций (например, коллекция system.users содержит всех пользователей базы данных). И также имя не должно содержать знака доллара - $.

Для добавления в коллекцию могут использоваться три ее метода:

  • insertOne(): добавляет один документ

  • insertMany(): добавляет несколько документов

  • insert(): может добавлять как один, так и несколько документов

Итак, добавим один документ:

1

> db.users.insertOne({"name": "Tom", "age": 28, languages: ["english", "spanish"]})

Документ представляет набор пар ключ-значение. В данном случае добавляемый документ имеет три ключа: name, age, languages, и каждому из них сопоставляет определенное значение. Например, ключу languages в качесте значения сопоставляется массив.

Некоторые ограничения при использовании имен ключей:

  • Символ $ не может быть первым символом в имени ключа

  • Имя ключа не может содержать символ точки .

При добавлении данных, если мы явным образом не предоставили значение для поля "_id" (то есть уникального идентификатора документа), то оно генерируется автоматически. Но в принципе мы можем сами установить этот идентификатор при добавлении данных:



1

> db.users.insertOne({"_id": 123457, "name": "Tom", "age": 28,

languages: ["english", "spanish"]})

Стоит отметить, что названия ключей могут использоваться в кавычках, а могут и без кавычек.

В случае удачного добавления на консоль будет выведен идентификатор добавленного документа.

И чтобы убедиться, что документ в бд, мы его выводим функцией find.

1

> db.users.find()

По умолчанию он выводит все документы коллекции:



Чтобы вывести в более читабельном виде добавим метод pretty():

1

> db.users.find().pretty()

Если надо добавить ряд документов, то мы можем воспользоваться методом insertMany():

1

2

> db.users.insertMany([{"name": "Bob", "age": 26, languages: ["english", "french"]},

{"name": "Alice", "age": 31, languages:["german", "english"]}])

После добавления консоль выводит идентификаторы добавленных документов:


Есть еще один способ добавления в бд документа, который включает два этапа: определение документа (document = ( { ... } )) и собственно его добавление:


1

2

> document=({"name": "Bill", "age": 32, languages: ["english", "french"]})

> db.users.insertOne(document)

Возможно, не всем будет удобно вводить в одну строчку все пары ключей и свойств. Но интеллектуальный интерпретатор MongoDB на основе javascript позволяет также вводить и многострочные команды. Если выражение не закончено (с точки зрения языка JavaScript), и вы нажимаете Enter, то ввод следующей части выражения автоматически переносится на следующую строку:


Загрузка данных из файла


Данные для базы данных mongodb можно определять в обычном текстовом файле, что довольно удобно, поскольку мы можем переносить или пересылать этот файл независимо от базы данных mongodb. Например, определим где-нибудь на жестком диске файл 
users.js со следующим содержимым:

1

2

3

4

5

db.users.insertMany([

{"name": "Alice", "age": 31, languages: ["english", "french"]},

{"name": "Lene", "age": 29, languages: ["english", "spanish"]},

{"name": "Kate", "age": 30, languages: ["german", "russian"]}

])

То есть здесь с помощью метода insertMany добавляются три документа в коллекцию users.

Для загузки файла в текущую базу данных применяется функция load(), в которую в качестве параметра передается путь к файлу:

1

> load("D:/users.js")

В данном случае предполагается, что файл располагается по пути "D:/users.js".

Выборка из БД

Наиболее простой способом получения содержимого БД представляет использование функции find. Действие этой функции во многом аналогично обычному запросу SELECT * FROM Table, который применяется в SQL и который извлекает все строки. Например, чтобы извлечь все документы из коллекции users, созданной в прошлой теме, мы можем использовать команду db.users.find().

Для вывода документов в более удобном наглядном представлении мы можем добавить вызов метода pretty():

1

> db.users.find().pretty()


Функция find() позволяет возвратить несколько документов. Еще одна функция findOne() работает похожим образом, только возвращает один документ:

1

> db.users.findOne()

Фильтрация данных


Однако что, если нам надо получить не все документы, а только те, которые удовлетворяют определенному требованию. Например, мы ранее в базу добавили следующие документы:

1

2

3

> db.users.insertOne({"name": "Tom", "age": 28, languages: ["english", "spanish"]})

> db.users.insertOne({"name": "Bill", "age": 32, languages: ["english", "french"]})

> db.users.insertOne({"name": "Tom", "age": 32, languages: ["english", "german"]})

Выведем все документы, в которых name=Tom:

1

> db.users.find({name: "Tom"})

Такой запрос выведет нам два документа, в которых name=Tom.

Теперь более сложный запрос: нам надо вывести те объекты, у которых name=Tom и одновременно age=32. То есть на языке SQL это могло бы выглядеть так: SELECT * FROM Table WHERE Name='Tom' AND Age=32. Данному критерию у нас соответствует последний добавленный объект. Тогда мы можем написать следующий запрос:


1

> db.users.find({name: "Tom", age: 32})

Фильтрация по отсутствующим свойствам


Какие-то документы могут иметь определенное свойство, другие могут его не иметь. Что если мы хотим получить документы, в которых отсутствует определенное свойство? В этом случае для свойства передается значение null. Например, найдем все документы, где отсутствует свойство languages:

1

> db.users.find({languages: null})

Или найдем все документы, где name="Tom", но свойство languages не определено.

1

> db.users.find({name: "Tom", languages: null})

Фильтрация по элементам массива


Также несложно отыскать по элементу в массиве. Например, следующий запрос выводит все документы, у которых в массиве languages есть english:

1

> db.users.find({languages: "english"})

Усложним запрос и получим те документы, у которых в массиве languages одновременно два языка: "english" и "german":

1

> db.users.find({languages: ["english", "german"]})

Причем именно в этом порядке, где "english" определен первым, а "german" - вторым.

Теперь выведем все документы, в которых "english" в массиве languages находится на первом месте:

1

> db.users.find({"languages.0": "english"})

Обратите внимание, что "languages.0" предоставляет сложное свойство и поэтому берется в кавычки. Соответственно если нам надо вывести документы, где english на втором месте (например, ["german", "english"]), то вместо нуля ставим единицу: "languages.1".

Проекция


Документ может иметь множество полей, но не все эти поля нам могут быть нужны и важны при запросе. И в этом случае мы можем включить в выборку только нужные поля, использовав проекцию. Например, выведем только порцию информации, например, значения полей "age" у все документов, в которых name=Tom:

1

> db.users.find({name: "Tom"}, {age: 1})

Использование единицы в качестве параметра {age: 1} указывает, что запрос должен вернуть только содержание свойства age.