MongoDB

Приступили к самому основному - операциям создания, чтения, изменения и удаления документов в MongoDB.

Аббревиатура для этих четырех операций - CRUD ( Create, Read, Update, Delete ).

В этом обзоре будет рассмотрен процесс создания документа - Create.

Два основных метода для создания нового документа в коллекции - метод insert и метод save.

Метод insert()

Команда создания нового документа в коллекции выглядит так:

db.COLLECTION_NAME.insert(document)

COLLECTION_NAME - это имя коллекции, в которой будет создаваться новый документ. document - это JavaScript-объект.

Создам новый документ в коллекции customers базы данных users. Для этого перейду в эту базу данных:

> use users
switched to db users

Создам коллецию customers в базе данных users:

> db.createCollection('customers')
{ "ok" : 1 }

Создам в коллекции customers новый документ. Можно использовать как одинарные, так и двойные кавычки - дело вкуса:

> db.customers.insert( { name: 'Leanne Graham', username: 'Bret', email: 'sincere@april.biz' } )
WriteResult({ "nInserted" : 1 })

MongoDB выдает отчет о выполнении команды в строке:

...
WriteResult({ "nInserted" : 1 })

Видно, что операция WriteResult успешно выполнилась - nInserted в значении true.

Как хорошо видно, создаваемый документ - это объект. Если нужно создать сразу несколько документов, то методу insert передается массив этих объектов:

> db.customers.insert( [ { name: 'Ervin Howell', username: 'Antonette', email: 'shanna@melissa.tv' }, { name: 'Clementine Bauch', username: 'Samantha', email: 'nathan@yesenia.net' } ] )
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})

BulkWriteResult выдает подробную информацию о выполненных операциях. Видно, что была выполнена только операция создания документа - “nInserted” : 2.

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

Вывести список созданных документов в коллекции customers можно при помощи метода .find():

> db.customers.find()
{ "_id" : ObjectId("59200cdc2bd83e7289a5cae4"), "name" : "Leanne Graham", "username" : "Bret", "email" : "sincere@april.biz" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae5"), "name" : "Ervin Howell", "username" : "Antonette", "email" : "shanna@melissa.tv" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae6"), "name" : "Clementine Bauch", "username" : "Samantha", "email" : "nathan@yesenia.net" }
>

Видно, что у каждого созданного мною документа есть ключ _id со значением ObjectId(). Этого ключа я не указывал при создании документа.

Все правильно - этот ключ и его значение MongoDB генерирует автоматически и присваивает каждому создаваемому документу. Таким образом MongoDB делает все документы уникальными - нет ни одного документа с одинаковым _id.

Можно сделать вывод метода .find() более читабельным, если подключить к нему по цепочке еще один метод - .pretty():

> db.customers.find().pretty()
{
	"_id" : ObjectId("59200cdc2bd83e7289a5cae4"),
	"name" : "Leanne Graham",
	"username" : "Bret",
	"email" : "sincere@april.biz"
}
{
	"_id" : ObjectId("59200e3b2bd83e7289a5cae5"),
	"name" : "Ervin Howell",
	"username" : "Antonette",
	"email" : "shanna@melissa.tv"
}
{
	"_id" : ObjectId("59200e3b2bd83e7289a5cae6"),
	"name" : "Clementine Bauch",
	"username" : "Samantha",
	"email" : "nathan@yesenia.net"
}
>

Метод save()

С помощью метода save() также можно создавать новый документ в коллекции. Создам еще один документ:

> db.customers.save( { name: 'Patricia Lebsack', username: 'Karianne', email: 'julianne.conner@kory.org' } )
WriteResult({ "nInserted" : 1 })

Сообщение от MongoDB говорит мне, что операция была выполнена успешно. Посмотрю на результат:

> db.customers.find()
{ "_id" : ObjectId("59200cdc2bd83e7289a5cae4"), "name" : "Leanne Graham", "username" : "Bret", "email" : "sincere@april.biz" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae5"), "name" : "Ervin Howell", "username" : "Antonette", "email" : "shanna@melissa.tv" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae6"), "name" : "Clementine Bauch", "username" : "Samantha", "email" : "nathan@yesenia.net" }
{ "_id" : ObjectId("592013152bd83e7289a5cae7"), "name" : "Patricia Lebsack", "username" : "Karianne", "email" : "julianne.conner@kory.org" }
>

Отличие метода save() от метода insert() заключается в том, что если при создании документа будет передан ключ _id уже существующего документа, то существующий документ будет перезаписан новым.

Вот у меня создан документ:

> db.customers.save( { name: 'Chelsey Dietrich', username: 'kamren', email: 'Lucio_Hettinger@annie.ca' } )
WriteResult({ "nInserted" : 1 })

И он успешно добавлен в коллекцию customers с уникальным ключом “_id” : ObjectId(“5920166b986c86064996f59e”):

> db.customers.find()
{ "_id" : ObjectId("59200cdc2bd83e7289a5cae4"), "name" : "Leanne Graham", "username" : "Bret", "email" : "sincere@april.biz" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae5"), "name" : "Ervin Howell", "username" : "Antonette", "email" : "shanna@melissa.tv" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae6"), "name" : "Clementine Bauch", "username" : "Samantha", "email" : "nathan@yesenia.net" }
{ "_id" : ObjectId("5920166b986c86064996f59e"), "name" : "Chelsey Dietrich", "username" : "kamren", "email" : "Lucio_Hettinger@annie.ca" }
> 

Теперь я создаю новый документ, но передаю в него существующую пару ключ-значение “_id” : ObjectId(“5920166b986c86064996f59e”):

> db.customers.save( { "_id" : ObjectId("5920166b986c86064996f59e"), name: 'Chelsey Dietrich', username: 'chelsey', email: 'c.dietrich@gmail.com' } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Смотрю результат:

> db.customers.find()
{ "_id" : ObjectId("59200cdc2bd83e7289a5cae4"), "name" : "Leanne Graham", "username" : "Bret", "email" : "sincere@april.biz" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae5"), "name" : "Ervin Howell", "username" : "Antonette", "email" : "shanna@melissa.tv" }
{ "_id" : ObjectId("59200e3b2bd83e7289a5cae6"), "name" : "Clementine Bauch", "username" : "Samantha", "email" : "nathan@yesenia.net" }
{ "_id" : ObjectId("5920166b986c86064996f59e"), "name" : "Chelsey Dietrich", "username" : "chelsey", "email" : "c.dietrich@gmail.com" }
>

… и вижу, что последний документ был полностью перезаписан. Вуаля.

На этом все.


MongoDB

Что такое document

Понятие документа - основа MongoDB. Недаром говорится, что MongoDB - документо-ориентированная система управления базами данных.

Document входит в состав collection и наполняет ее содержимым. Document - это обычный JSON-объект.

Если есть навык создания и работы с JSON-объектами, то уже можно создавать документы в MongoDB.

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

{
  "_id" : ObjectId("591f49970f7b726a5beb58af"),
  "name" : "Anna"
}

Стоит обратить внимание на ключ “_id” - этот ключ и значение ключа MongoDB автоматически генерирует для уникальной идентификации каждого документа в базе данных.

Чуть более сложный пример документа в MongoDB:

{
	"_id" : ObjectId("591f49970f7b726a5beb58af"),
	"name" : "Anna",
	"surname" : "Tudor",
	"music" : [
		"country",
		"blues",
		"chill-out"
	],
	"age" : 18,
	"virgin" : true
}

В данном случае документ состоит из нескольких типов данных - Number, Array, String, Boolean.

Два документа в коллекции canada базы данных users:

{
	"_id" : ObjectId("591f49970f7b726a5beb58af"),
	"name" : "Anna",
	"surname" : "Tudor",
	"music" : [
		"country",
		"blues",
		"chill-out"
	],
	"age" : 18,
	"virgin" : true
}
{
	"_id" : ObjectId("591f4eaf02ed4d6e1d81bc97"),
	"name" : "Leanne Graham",
	"username" : "Bret",
	"email" : "Sincere@april.biz",
	"address" : {
		"street" : "Kulas Light",
		"suite" : "Apt. 556",
		"city" : "Gwenborough",
		"zipcode" : "92998-3874",
		"geo" : {
			"lat" : "-37.3159",
			"lng" : "81.1496"
		}
	},
	"phone" : "1-770-736-8031 x56442",
	"website" : "hildegard.org"
}

Таких документов в коллекции canada может быть сколько угодно.

Вот в принципе и все, что нужно знать о документах в MongoDB.

На этом все.


MongoDB

Что такое collection

В базах данных MongoDB данные объединяются в коллекции - collection. В одной базе данных может быть от одной до многих collections.

Смысл collection - объединять однотипные данные. То есть данные, котороые можно объединить по какому-либо признаку.

Например, в базе данных animals может быть две collections - cats и dogs. В коллекции cats хранятся все данные, о которых можно сказать - “это данные по кошкам”. В коллекции dogs хранятся “все данные по собакам”.

Создание collection

В базе данных создать collection можно командой:

db.createCollection('NAME_COLLECTION')

Например, я создам две коллекции cats и dogs в базе данных animals. Для этого создам базу данных animals:

> use animals
switched to db animals
>

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

> db.createCollection('cats')
{ "ok" : 1 }

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

> db.createCollection('dogs')
{ "ok" : 1 }

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

show collections

Проверю, создались ли успешно коллеции cats и dogs в базе данных animals:

> show collections
cats
dogs

Переименование collection

Операция переименования collection в MongoDB выполняется командой:

db.collection.renameCollection('NEW_NAME')

Например, я создал коллекцию bird в базе данных animals:

> db.createCollection('bird')
{ "ok" : 1 }
> show collections
bird
cats
dogs
>

… и хочу переименовать эту коллецию в birds:

> db.bird.renameCollection('birds')
{ "ok" : 1 }
> show collections
birds
cats
dogs
>

В результате коллекция bird успешно переименована в birds.

Удаление collection

В MongoDB удаление коллекции выполняется командой:

db.COLLECTION_NAME.drop()

Например, я хочу удалить коллекцию birds из базы данных animals:

> db.birds.drop()
true
> show collections
cats
dogs
>

Коллекция birds успешно удалена из базы данных.

Создание collection - автоматический способ

В MongoDB имеется способ автоматического создания collection - путем добавления документа в новую коллецию при помощи метода insert.

Например, коллекции insects в базе данных animals не существует. В будущую коллекцию insects я добавлю документ cockroach и тем самым автоматически создам коллецию insects:

> db.insects.insert({ name: 'cockroach' })
WriteResult({ "nInserted" : 1 })
> show collections
cats
dogs
insects
>

На этом все.


MongoDB

Создание базы данных

В двух предыдущих примерах научились устанавливать MongoDB. А также научились запускать и останавливать сервер MongoDB.

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

Командная оболочка MongoDB носит имя mongo-shell и запускается в Linux одной командой:

mongo

В консоли отобразится сообщение и приглашение командной строки, говорящее о том, что мы находимся в командной оболочке MongoDB:

MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
...
> 

Список баз данных

Увидеть список всех существующих баз данных можно командой:

show dbs

Вот список баз данных на момент установки MongoDB в системе Linux. Видно, что обе базы пустые:

> show dbs
admin  0.000GB
local  0.000GB
> 

Создать базу данных

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

use DATABASE_NAME

Например, создам новую базу данных по имени users:

> use users
switched to db users
> 

Команда user универсальная. Если база данных users уже существует, то будет выполнен просто переход в эту базу данных.

Если базы данных users не существует, то она будет создана и будет выполнен автоматический переход в эту базу данных.

Имя базы данных

Узнать имя текущей ( в которой на данный момент нахожусь ) базы данных можно командой:

db

В моем случае это будет так:

> db
users
>

Удаление базы данных

Удалить базу данных можно командой:

db.dropDatabase()

Важный момент - нужно находиться в той базе данных, которую необходимо удалить. Команда dropDatabase() не принимает аргументов.

Например, я хочу удалить базу данных users:

> show dbs
admin  0.000GB
local  0.000GB
users  0.000GB
>

Для этого я перейду в базу данных users:

> use users
switched to db users
>

И выполню команду dropDatabase():

> db.dropDatabase()
{ "dropped" : "users", "ok" : 1 }
>

Посмотрю список баз данных после удаления базы users и удостоверюсь, что она удалена успешно:

> show dbs
admin  0.000GB
local  0.000GB
>

На этом все.


MongoDB

Управление MongoDB

MongoDB управляется так же, как и все остальные процессы в системе Linux.

Запуск MongoDB

Сервер MongoDB запускается командой:

sudo service mongod start

Будет “висеть” в фоновом режиме и слушать команды на порту 27017.

Остановка MongoDB

Остановить сервер MongoDB можно командой:

sudo service mongod stop

Перезапуск MongoDB

Если нужно перезапустить сервер MongoDB, то это выполняется командой:

sudo service mongod restart

Статус MongoDB

Посмотреть статус сервера MongoDB можно командой:

sudo service mongod status

Покажет, запущен сервер MongoDB и его текущее состояние.