Статьи

Начало работы с MongoDB — часть 1

Готовы приступить к изучению MongoDB, одной из самых крутых технологий для веб-разработчиков?

В этой новой серии вы перейдете от новичка к профессионалу и сможете использовать Mongo так же легко, как MySQL в своих веб-приложениях. Но сначала давайте посмотрим на основы.


Что если бы вы могли хранить программные модели почти так же, как вы их моделируете?

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

Что если бы вы могли хранить программные модели почти так же, как вы их моделируете? Что если бы вы могли хранить их такими, как они есть, а не в виде ряда строк в таблицах? Узнав о MongoDB, вы сможете сделать именно это!

В этой серии статей мы изучим все от основ MongoDb, таких как создание, обновление и удаление баз данных и записей, до возможности выполнять сложные поиски данных и анализ элементарных данных с помощью MapReduce. Итак, без лишних слов — давайте начнем!

Примечание. Этот учебник сделан с точки зрения системы на основе NIX, такой как Mac OSX, Linux BSD и так далее. Но вы должны быть в состоянии следовать, если вы используете Windows достаточно хорошо, поскольку есть сборки для большинства платформ.


Итак, вот где начинается самое интересное. Мы собираемся начать с установки Mongo. Перейдите на веб-сайт MongoDb и нажмите на ссылку для загрузки.

The MongoDb link to downloads

Это приведет вас на страницу, где вы сможете получить сборку для вашей платформы и архитектуры.

The MongoDb download options

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

Если вы работаете на машине с Nix, используйте менеджер пакетов для установки последней версии для вашей платформы.

С этим из пути, запустите терминал и введите mongo . Это откроет оболочку Монго и позволит нам начать. Все хорошо, вы увидите вывод, подобный приведенному ниже:

The MongoDb shell

Если вы видите это, тогда вы готовы к работе.


Изначально база данных не создается. Но не волнуйтесь, они сразу же будут созданы, когда мы начнем вставлять наши записи, что мы собираемся сделать прямо сейчас. Скопируйте содержимое ниже и вставьте его в оболочку mongo

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
db.nettuts.insert({
    first: ‘matthew’,
    last: ‘setter’,
    dob: ’21/04/1978′,
    gender: ‘m’,
    hair_colour: ‘brown’,
    occupation: ‘developer’,
    nationality: ‘australian’
});
        db.nettuts.insert({
    first: ‘james’,
    last: ‘caan’,
    dob: ’26/03/1940′,
    gender: ‘m’,
    hair_colour: ‘brown’,
    occupation: ‘actor’,
    nationality: ‘american’
});
db.nettuts.insert({
    first: ‘arnold’,
    last: ‘schwarzenegger’,
    dob: ’03/06/1925′,
    gender: ‘m’,
    hair_colour: ‘brown’,
    occupation: ‘actor’,
    nationality: ‘american’
});
db.nettuts.insert({
    first: ‘tony’,
    last: ‘curtis’,
    dob: ’21/04/1978′,
    gender: ‘m’,
    hair_colour: ‘brown’,
    occupation: ‘developer’,
    nationality: ‘american’
});
db.nettuts.insert({
    first: ‘jamie lee’,
    last: ‘curtis’,
    dob: ’22/11/1958′,
    gender: ‘f’,
    hair_colour: ‘brown’,
    occupation: ‘actor’,
    nationality: ‘american’
});
db.nettuts.insert({
    first: ‘michael’,
    last: ‘caine’,
    dob: ’14/03/1933′,
    gender: ‘m’,
    hair_colour: ‘brown’,
    occupation: ‘actor’,
    nationality: ‘english’
});
db.nettuts.insert({
    first: ‘judi’,
    last: ‘dench’,
    dob: ’09/12/1934′,
    gender: ‘f’,
    hair_colour: ‘white’,
    occupation: ‘actress’,
    nationality: ‘english’
});

Все хорошо? Отлично! Чтобы подтвердить, что база данных и сопутствующие записи были созданы, введите следующую команду:

1
db.nettuts.find()

Если все пошло по плану, то вы увидите следующий вывод:

Finding all records

Это показывает, что все записи были созданы в базе данных. Прежде чем идти дальше, нужно отметить одну вещь — поле id . Это автоматически генерируется Mongo для вас, если вы не указали идентификатор. Причина в том, что каждая запись должна иметь уникальное поле id .

Вы можете видеть, что у нас есть одна запись для каждого из тех, которые мы вставляем — теперь мы готовы начать запрашивать их.


Вы помните предыдущую команду? Он извлекал и отображал каждую запись в базе данных. Полезно, да, но как вы можете быть более конкретным? Как вы находите всех актеров женского пола, отфильтровывающих мужчин? Это хороший вопрос, и ответ — селекторы.

Селекторы для Mongo, а where — для SQL. Что касается предложений where, селекторы Mongo позволяют нам делать следующее:

  • указать критерии, которые MUST соответствовать. то есть предложение AND
  • укажите критерии, которые могут при желании соответствовать. т. е. предложение OR
  • указать критерии, которые MUST существовать
  • и многое другое…

Давайте начнем с основного селектора. Скажем, что мы хотим найти all actors that are female
, Для этого вам нужно выполнить следующую команду:

1
db.nettuts.find({gender: ‘f’});

Здесь мы указали, что пол должен быть равен «F».

Выполнение этой команды вернет следующий вывод:

Finding all female records

Что если мы хотим найти актеров мужского пола? Запустите следующую команду:

1
db.nettuts.find({gender: ‘m’});

Мы получим следующие результаты:

Finding all male records

Давайте сделаем это на ступеньку выше. Мы будем искать английских актеров мужского пола.

1
db.nettuts.find({gender: ‘m’, $or: [{nationality: ‘english’}]});

Запуск, который вернет следующие результаты:

Finding all male, English, records

А как насчет мужских актеров, которые англичане или американцы? Легко! Давайте изменим нашу предыдущую команду, чтобы включить американцев:

1
db.nettuts.find({gender: ‘m’, $or: [{nationality: ‘english’}, {nationality: ‘american’}]});

По этому запросу мы увидим следующие результаты:

Finding all male, English or American, records

Что если мы хотим отсортировать записи, скажем, по имени или национальности? Как и в SQL, Mongo предоставляет команду sort . Команда, как и команда find принимает список опций для определения порядка сортировки.

В отличие от SQL, мы указываем возрастание и убывание по-разному. Мы делаем это следующим образом:

  • По возрастанию: -1
  • По убыванию: 1

Давайте посмотрим на пример:

1
db.nettuts.find({gender: ‘m’, $or: [{nationality: ‘english’}, {nationality: ‘american’}]}).sort({nationality: -1});

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

Finding all male, English or American, records sorted by nationality

Как насчет сортировки по национальности в порядке убывания и имени в порядке возрастания? Совершенно никаких проблем! Посмотрите на запрос ниже, который является модифицированной версией последнего, который мы запустили.

1
db.nettuts.find({gender: ‘m’, $or: [{nationality: ‘english’}, {nationality: ‘american’}]}).sort({nationality: -1, first: 1});

На этот раз мы получаем следующие результаты и т. Д.

Finding all male, English or American, records sorted by nationality first and first name second

Вы можете видеть, что на этот раз Арнольд Шварценеггер находится перед Тони Кертисом.


Что если бы у нас был довольно большой набор данных (нам повезло, мы этого не делаем), и мы хотели бы ограничить результаты только двумя? Mongo предоставляет команду limit, аналогичную MySQL, и позволяет нам это делать. Давайте обновим наш предыдущий запрос и вернем только 2 записи. Посмотрите на следующую команду:

1
db.nettuts.find({gender: ‘m’, $or: [{nationality: ‘english’}, {nationality: ‘american’}]}).limit(2);

Из этой команды мы получим следующие результаты:

Limit output to 2 records

Если мы хотели третью и четвертую записи, т.е. пропустить первые две? Еще раз, у Монго есть функция для этого. Посмотрите на дальнейшую настройку предыдущей команды:

1
db.nettuts.find({gender: ‘m’, $or: [{nationality: ‘english’}, {nationality: ‘american’}]}).limit(2).skip(2);

Запуск, который вернет следующие результаты:

Limit output to the 3rd and 4th records

Из исходного набора результатов видно, что первые два были пропущены.


Как и ожидалось, Mongo также предоставляет возможность обновлять записи. Как и в случае метода find и запросов SQL, вам необходимо указать критерии для записи, которую вы хотите изменить, а затем данные в этой записи, которые будут изменены.

Допустим, нам нужно обновить запись для Джеймса Каана, указав, что его волосы седые, а не коричневые. Хорошо для этого мы запускаем функцию обновления. Посмотрите на пример ниже:

1
db.nettuts.update({first: ‘james’, last: ‘caan’}, {$set: {hair_colour: ‘brown’}});

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

1
db.nettuts.find({first: ‘james’, last: ‘caan’});

После этого вы увидите следующий результат:

Update record

Это показывает, что обновление работало. Одно слово предостережения: если вы не передадите модификатор $set , то вы замените запись , если она доступна, вместо ее обновления . Быть осторожен!


Я думаю, что на этом этапе вы действительно начали понимать, как работать с Монго. Правильно, если вы хотите удалить запись, вы должны передать набор селекторов, как и в случае с SQL, чтобы определить набор записей для удаления. Если вы этого не сделаете, вы удалите все записи — и базу данных.

Итак, допустим, что мы не хотим, чтобы Джеймс Каан был в нашем списке актеров. Давайте удалим его из базы данных, используя следующую команду:

1
db.nettuts.remove({first: ‘james’, last: ‘caan’});

Как и в случае с обновлением, никаких видимых выходных данных, указывающих, были ли мы успешными или нет, не предоставлено — поэтому давайте проведем поиск, чтобы проверить дважды.

1
db.nettuts.find({first: ‘james’, last: ‘caan’});

После этого вы не увидите никаких результатов. Если это то, что вы нашли, то мы успешно удалили Джеймса Каана из нашей базы данных. Но что, если мы хотим удалить все записи из базы данных?

Ну, чтобы сделать это, просто удалите селекторы из предыдущего вызова, чтобы удалить, как показано ниже.

1
2
db.nettuts.remove();
db.nettuts.find();

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

Remove all records

В этом быстром введении в использование MongoDB мы рассмотрели:

  • Что такое Монго
  • Как его установить
  • Как создавать, находить, обновлять и удалять записи

С этим знанием вы можете пойти, попрактиковаться и узнать больше об этой замечательной технологии. Если вам нужна дополнительная информация, не стесняйтесь посетить веб-сайт MongoDb или подписаться на @mongodb в Twitter .

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

Обновление: вторая часть этой серии была размещена и может быть найдена здесь .