Разделы портала

Онлайн-тренинги

.
Самое простое в мире руководство по MongoDB
26.03.2020 01:00

Автор: Кристин Джеквони (Kristin Jackvony)
Оригинал статьи
Перевод: Ольга Алифанова

MongoDB – одна из наиболее популярных современных нереляционных баз данных. Ее гибкость, скорость и масштабируемость делают ее распространенным выбором для приложений, хранящих данные в JSON-формате. Установить ее и создать базу данных очень легко, однако язык запросов тут сильно отличается от языка запросов SQL. Когда я только начинала работать с MongoDB, меня раздражала документация ее языка запросов: в ней или пытались объяснить чересчур многое, или примеры были чересчур сложными. Я неоднократно раздраженно говорила "Да как мне просто-напросто сделать запрос 'select lastName from contacts where id = 3?!!'

Из-за этого раздражения я и создала свое собственное руководство. В нем я приведу ряд простейших примеров запросов, к которым вы, возможно, привыкли в SQL.

Установка MongoDB

Эта статья посвящена именно запросам, поэтому я пропущу инструкцию по установке, и вместо этого отправлю вас сюда для MacOSX, и сюда для Windows. Когда вы закончите установку, то увидите командное окно Mongo.

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

Создать новую базу невероятно легко. Мы назовем нашу базу "tutorial". Чтобы создать ее, просто введите " use tutorial". Вы получите ответ " switched to db tutorial". Ура! Ваша база данных создана.

Добавление документа

Конечно, сейчас ваша БД абсолютно пуста. Давайте сделаем с этим что-нибудь и введем:

db.tutorial.insertOne( { _id: 1, firstName: "Prunella", lastName: "Prunewhip" } ).
Вы получите ответ:
{ "acknowledged" : true, "insertedId" : 1 }.

Вы только что добавили ваш первый документ! Заметьте, что "документ" тут эквивалентен "записи" в базе данных SQL. У вашего документа есть id (который по традиции начинается с _), имя и фамилия.

Запрос всех документов

Давайте убедимся, что документ действительно добавлен, запросив его.

db.tutorial.find()

Вот что вы получите:

{ "_id" : 1, "firstName" : "Prunella", "lastName" : "Prunewhip" }.

Пустая команда find() найдет все документы в базе данных. Сейчас у нас он всего один, поэтому один нам и показали.

Добавление нескольких документов

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

db.tutorial.insertMany([ { _id: 2, firstName: "Joe", lastName: "Schmoe" }, { _id: 3, firstName: "Amy", lastName: "Smith" }, { _id: 4, firstName: "John", lastName: "Smith" }, { _id: 5, firstName: "Joe", lastName: "Bagadonuts" }, { _id: 6, firstName: "Carol", lastName: "Jones" }, { _id: 7, firstName: "Robert", lastName: "Johnson" } ]).

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

{ "acknowledged" : true, "insertedIds" : [ 2, 3, 4, 5, 6, 7 ] }.

Теперь в вашей базе семь записей.

Если вы запросите все документы на этом этапе, используя db.tutorial.find(), то вы получите вот такой результат:

{ "_id" : 1, "firstName" : "Prunella", "lastName" : "Prunewhip" }
{ "_id" : 2, "firstName" : "Joe", "lastName" : "Schmoe" }
{ "_id" : 3, "firstName" : "Amy", "lastName" : "Smith" }
{ "_id" : 4, "firstName" : "John", "lastName" : "Smith" }
{ "_id" : 5, "firstName" : "Joe", "lastName" : "Bagadonuts" }
{ "_id" : 6, "firstName" : "Carol", "lastName" : "Jones" }
{ "_id" : 7, "firstName" : "Robert", "lastName" : "Johnson" }


Запрос одного документа
Для запроса одного документа используйте следующий синтаксис:

db.tutorial.find( { _id: 1 } ).
Такой запрос вернет документ с id 1.
{ "_id" : 1, "firstName" : "Prunella", "lastName" : "Prunewhip" }


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

Прошлый запрос по id всегда будет возвращать один документ, так как id уникален. Если вы хотите найти все документы, содержащие определенное значение, то это делается так:

db.tutorial.find({ lastName: "Smith"}).
Этот запрос вернет все записи с фамилией Смит:
{ "_id" : 3, "firstName" : "Amy", "lastName" : "Smith" }
{ "_id" : 4, "firstName" : "John", "lastName" : "Smith" }

Запрос единичного значения внутри одного документа

Допустим, вам нужно найти фамилию из документа с id 3. Вот как это сделать:

db.tutorial.find({ _id: 3}, {lastName:1, _id:0}).
Результат:
{ "lastName" : "Smith" }.

_id:0 тут приводится, чтобы уточнить, что вы не хотите видеть id в ответе – по умолчанию id всегда возвращается в ответах MongoDB.

Возврат всех значений определенного поля

Если вы хотите получить список всех фамилий в своей БД, то это делается так:

db.tutorial.find({}, {lastName:1, _id:0}).
Результат:
{ "lastName" : "Prunewhip" }
{ "lastName" : "Schmoe" }
{ "lastName" : "Smith" }
{ "lastName" : "Smith" }
{ "lastName" : "Bagadonuts" }
{ "lastName" : "Jones" }
{ "lastName" : "Johnson" }

Поиск вида "Начинается с…"

MongoDB использует регулярные выражения для поиска по значениям полей. Чтобы найти все документы, в которых фамилии начинаются с S, сделайте так:

db.tutorial.find({ lastName: /^S/}).

Результат:

{ "_id" : 2, "firstName" : "Joe", "lastName" : "Schmoe" }
{ "_id" : 3, "firstName" : "Amy", "lastName" : "Smith" }
{ "_id" : 4, "firstName" : "John", "lastName" : "Smith" }

Поиск с AND

Если вы хотите найти документ с определенным именем и определенной фамилией, то вот как это сделать:

db.tutorial.find( {$and: [{ lastName: "Smith" },{ firstName: "Amy"}]} )

Результат:

{ "_id" : 3, "firstName" : "Amy", "lastName" : "Smith" }.

Поиск с IN

Чтобы найти все документы с фамилиями Смит или Джонс, сделайте так:

db.tutorial.find({lastName :{$in :["Smith","Jones"]}}).

Результат:

{ "_id" : 3, "firstName" : "Amy", "lastName" : "Smith" }
{ "_id" : 4, "firstName" : "John", "lastName" : "Smith" }
{ "_id" : 6, "firstName" : "Carol", "lastName" : "Jones" }

Обновление документа

Если вы хотите изменить существующий документ, используйте команду Update. К примеру, для изменения фамилии в третьем документе на Jones введите вот что:

db.tutorial.updateOne({_id: 3 }, {$set: {lastName: "Jones"}}).

Результат:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }.

Чтобы убедиться, что запись верно обновилась, используйте команду db.tutorial.find( { _id: 3 } ), которая вернет { "_id" : 3, "firstName" : "Amy", "lastName" : "Jones" }.

Удаление документа

И, наконец, вам может потребоваться удалить документ. Вот как это сделать:

db.tutorial.deleteOne({_id: 4 })

Результат:

{ "acknowledged" : true, "deletedCount" : 1 }.

Чтобы убедиться, что документ удален, прогоните db.tutorial.find(). Вот что вы увидите:

{ "_id" : 1, "firstName" : "Prunella", "lastName" : "Prunewhip" }
{ "_id" : 2, "firstName" : "Joe", "lastName" : "Schmoe" }
{ "_id" : 3, "firstName" : "Amy", "lastName" : "Jones" }
{ "_id" : 5, "firstName" : "Joe", "lastName" : "Bagadonuts" }
{ "_id" : 6, "firstName" : "Carol", "lastName" : "Jones" }
{ "_id" : 7, "firstName" : "Robert", "lastName" : "Johnson" }

Как можно видеть, документ с id 4 теперь отсутствует в базе.

Это, конечно, не все, что можно сделать в MongoDB, но для начала достаточно. Можете также просмотреть предыдущую статью, где есть примеры работы с вложенными значениями в MongoDB. Надеюсь, что эта статья была полезной и помогла вам понять, как работает Mongo. Удачных запросов!

Обсудить в форуме