MongoDB в Linux. Dbs и collection, работа с документами. Этап №2

Данный материал является логическим продолжением первой статьи цикла по работе с нереляционной СУБД MongoDB. MongoDB коллекции и документы являются основными понятиями для пакета, они и будут рассмотрены в рамках статьи.

В консоли возможно выполнение арифметических операций MongoDB

> 2+2
4

Возможно определение переменных таким же образом как это реализуется в JavaScript

var color = «red»

Обращение к переменной производится следующим образом

>print('my favorite color is '+color)

my favorite color is red

 

 

MongoDB коллекции и работа с ними

Разберем создание коллекций и их назначение на примере. В процессе наполним коллекцию и БД информацией и будем выбирать подходящие под заданные критерии поиска записи. Просматриваем существующие базы

show dbs

 admin 0.000GB
local 0.000GB
people 0.000GB

 

Будем работать с одной из них

use people

switched to db people

 

Сматрис collections

show collections

Вывод команды пустой.

 

Создадим коллекцию employees

db.createCollection(«employees»)

{ «ok» : 1 }

 

В mongodb коллекции эквивалентны таблицам в реляционных СУБД, записи эквивалентны строкам.

Создадим запись или документ

vitaliy = {

firstname: «Vitaliy»,
lastname:»Samaoylov»,
dept:»Sales»,
started:»1988",
};

 

 

Запись сейчас находится в памяти, но в базе данных не сохранено

Сохраняем

db.employees.save(vitaliy)

WriteResult({ «nInserted» : 1 })

 

Ищем работников

db.employees.find()

{ «_id» : ObjectId(«59e0b543f9e48aadb7c1c698»), «firstname» : «Vitaliy», «lastname» : «Samaoylov», «dept» : «Sales», «started» : «1988» }

Результатом поиска должен быть идентификатор только что добавленного объекта и информация о нем

 

 

Если производится сохранение — при этом запись уже присутствует в БД данные будут обновлены. При использовании insert этого не произойдет если на необходимость обновления не указать непосредственно

> db.employees.insert({firstName:»Michel»},{lastName:»Volkov»},{dept:»Web Design»},{started: 2006})

WriteResult({ «nInserted» : 1 })

db.employees.find().pretty()

pretty обеспечивает вывод в более читабельном формате — сейчас в результатах поиска по БД будут уже два сотрудника

 

Можно работать с множеством записей, в примере добавляются 2 записи

> db.employees.insert([{firstname:»Fedor»,lastName:»Ivanov»,dept:»Programming»,started:1999}, {firstname:»Nikolay»,lastName:»Petrov»,dept:»Sales»,started :2014}])

db.employees.find().pretty()

В выводе теперь присутствует информация о двоих новых сотрудниках.

 

use test

switched to db test

 

db.createCollection('squares')
for(var i = 0;i < 50;i++){ db.squares.save({n: i,square: i*i}) }

WriteResult({ «nInserted» : 1 })

db.squares.find().pretty()

{ «_id» : ObjectId(«59e0b7d9f9e48aadb7c1c69c»), «n» : 0, «square» : 0 }
{ «_id» : ObjectId(«59e0b7d9f9e48aadb7c1c69d»), «n» : 1, «square» : 1 }
{ «_id» : ObjectId(«59e0b7d9f9e48aadb7c1c69e»), «n» : 2, «square» : 4 }
{ «_id» : ObjectId(«59e0b7d9f9e48aadb7c1c69f»), «n» : 3, «square» : 9 }
{ «_id» : ObjectId(«59e0b7d9f9e48aadb7c1c6a0»), «n» : 4, «square» : 16 }
{ «_id» : ObjectId(«59e0b7d9f9e48aadb7c1c6a1»), «n» : 5, «square» : 25 }

Видим результат в котором каждое число перебираемое в цикле возводится в квадрат, результат записывается в базу squares

 

Снова переходим к базе с которой работали изначально

use people

db.employees.find().pretty()

 

Добавим array с признаками, который других элементам базы свойственен не будет

will = {firstname:»Roman», lastname:»Isidorov», dept:»Programming», started:2002, skills:[«web design», «graphic design», «web programming»]}

 

Сохраняем введенные значения

db.employees.save(will)

WriteResult({ «nInserted» : 1 })

 

Просматриваем список сотрудников

db.employees.find().pretty()

 

 

Другие операции с базами данных MongoDB

Производим поиск по департаменту, в котором работает сотрудник

db.employees.find({dept:»Sales»,started:2002}).pretty()

{
«_id» : ObjectId(«59e0b6fcf9e48aadb7c1c69b»),
«firstname» : «Nikolay»,
«lastName» : «Petrov»,
«dept» : «Sales»,
«started» : 2014
}

Получим выборку с идентификатором и первыми двумя полями

 

Можно с легкостью выбрать только имена и фамилии сотрудников с их идентификаторами в базе

db.employees.find({},{firstName:1,lastName:1})

{ «_id» : ObjectId(«59e0b543f9e48aadb7c1c698») }
{ «_id» : ObjectId(«59e0b5d1f9e48aadb7c1c699»), «firstName» : «Michel» }
{ «_id» : ObjectId(«59e0b6fcf9e48aadb7c1c69a»), «lastName» : «Ivanov» }
{ «_id» : ObjectId(«59e0b6fcf9e48aadb7c1c69b»), «lastName» : «Petrov» }
{ «_id» : ObjectId(«59e0b8d4f9e48aadb7c1c6ce») }

 

 

В MongoDB можно использовать операторы сравнения gt — больше чем

db.employees.find({started:{$gt:2005}}).pretty()

Команда выведет данные о сотрудниках, которые пришли в компанию после 2005 года

 

Также применяются булевские операторы сравнения (И, ИЛИ) — можно узнать кто пришел до 2000 года и после 2010

db.employees.find({$or:[{started:{$lt:2000}},{started:{$gte:2010}}]}).pretty()

Здесь gte — больше или равно

Так можно выяснить, что в отделе продаж нет никого кто начал бы трудовую деятельность ранее 2000 года

db.employees.find({$and:[{started:{$lt:2000}},{dept:»Sales»}]}).pretty()

 

Сейчас найдем массив или значение в поддокументах

db.employees.find({skills: [«Internet Marketing»,»SEO»,»Advertising» ]}).pretty()

В выводе будет только сотрудник обладающий всеми тремя заданными навыками

 

Чтобы найти сотрудника, обладающего одним навыком можно применять выражение следующего вида:

db.employees.find({skills:»Web Design»}).pretty()

 

Поиск в поддокументах по всем указанным параметрам:

db.employees.find({address:{street:»656 Israel ave»,city:»Porthmuth»,state:»NH»}})

По одному значению:

db.employees.find({«address.state»:»MA»}).prety

 

При поиске по поддокументам поддокументов потребуется использовать конструкцию вида address.statr.something

Когда коллекция больше не нужна ее можно удалить

db.getCollection(«employees»).drop()

true

 

Как и для реляционных БД, для Mongo существует понятие дампа — информацию из базы можно сохранить в файл. В дальнейшем восстановив из него на том же или другом сервере.