MongoDB. Урок 4. Сохранение модели


Содержание материала:

# Используем Mongoose для работы с Mongodb

В этом видео мы с вами разберем что такое пакет mongoose в nodejs. Для этого урока у вас должна быть установлена mongodb и node.

Итак mongoose — это ORM для базы данных mongodb для node. Для тех кто не знает, что такое ORM — это Object-relational mapping. То есть идея состоит, например, чтобы работать с mongodb в node мы могли бы использовать mongodb драйвер. Это очень низкоуровневая библиотека, которая просто дает возможность делать обращения к базе. ORM же позволяет создавать модели и зависимости между ними и использовать специальный API для работы с базой. Это, конечно, не так гибко, как выполнять запросы к базе напрямую, но дает возможность лучше структурировать ваш код.

У меня создан пустой проект в который я установил 2 пакета: mongoose и bluebird.

Пакет bluebird — это библиотека для промисов. Здесь она нам понадобится, чтобы указать mongoose, какие промисы нужно использовать.

Также, не забудьте, что вам нужно запустить процесс mongodb. Например на mac я его запускаю в консоли командой mongod.

Итак у меня есть index.js файл и в него давайте зарекваирим mongoose.

После этого мы хотим указать mongoose правильные промисы.

Если вы не напишите эту строчку, то получите много варнингов от mongoose в консоли.

Далее мы хотим подключится к нашей базе mongodb. Это можно сделать с помощью команды connect.

Первым параметром мы указываем host и название базы. Вторым параметром опции для connect.

После коннекта мы можем получить из mongoose connection, с которым мы дальше будем работать.

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

Если мы попробуем остановить процесс mongodb и запустить сервер, то мы получим ошибку, которую мы увидим именно из-за подписки на on error.

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

Если мы перезапустим вебсервер и посмотрим в консоль, то у нас должнo вывестить «we are connected».

Теперь мы готовы к использованию mongoose.

Так как вся логика работы с mongoose построена на моделях, то нам нужно создать модель, с которой мы хотим работать. Давайте создадим модель User в отдельном файле models/user.

Сначала мы импортируем пакет mongoose и описываем схему нашего usera. У нас будет одно поле name, типа String. После этого мы должны из схемы создать модель. В этом нам поможет mongoose.model. И экспортируем ее, чтобы использовать в других местах.

Теперь давайте импортируем ее в index.js

Теперь мы можем работать с моделью, а не с mongodb напрямую. Например, давайте создадим нового юзера.

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

Но new User в базу ничего не сохраняет. Теперь, если мы хотим сохранить этого юзера в базу, то мы должны на экземпляре вызвать метод save.

Если мы посмотрим в консоль, то наш user был успешно сохранен.

Теперь давайте попробуем найти этого юзера по id. Для этого давайте закомментим создание и напишем.

Mongoose предоставляет нам специальный метод, для поиска записи по id. Обратите внимание, что мы не указываем из какой коллекции брать данные. Mongoose сам создает под каждую модель нужную коллекцию и нам остается только использовать правильное API.

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

Обязательно пишите в комментариях, если вы хотите больше уроков по функционалу и возможностям mongoose.

Интеграция MongoDB в приложение Node.js: создание модели и контроллера

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

Данный мануал поможет интегрировать MongoDB в существующее приложение Node. Базы данных NoSQL (к которым относится MongoDB) подходят для управления данными, которым нужна высокая масштабируемость и гибкость. Также MongoDB хорошо интегрируется с Node, поскольку она разработана для асинхронной работы с объектами JSON.

Читайте также: Основы работы с JSON

Чтобы интегрировать MongoDB в ваш проект, вы будете использовать ODM Mongoose (Object Document Mapper, объектно-документное отображение) для создания схем и моделей данных вашего приложения. Это позволит вам организовать код приложения в соответствии с архитектурным шаблоном модель-представление-контроллер (MVC), который позволяет отделить логику обработки пользовательского ввода от структурирования данных и представления их пользователю. Этот шаблон может облегчить дальнейшее тестирование и разработку путем разделения элементов.

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

Требования

  • Локальная машина или сервер разработки Ubuntu 18.04, настроенная по этому мануалу.
  • Установка Node.js и npm на вашей машине разработки (инструкции по установке из PPA есть в мануале Установка Node.js в Ubuntu 18.04).
  • Установка MongoDB (раздел 1 этого мануала).

1: Создание пользователя MongoDB

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

Сначала убедитесь, что MongoDB на вашем сервере работает:

sudo systemctl status mongodb

Следующий вывод показывает, что MongoDB работает правильно:

mongodb.service — An object/document-oriented database
Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-01-31 21:07:25 UTC; 21min ago
.

Затем откройте оболочку Mongo, чтобы создать своего пользователя:

Это поместит вас в оболочку:

MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
.
>

При этом вы увидите несколько предупреждений, связанных с вашим неограниченным доступом к базе данных admin. Вы можете узнать больше об ограничении этого доступа в производственной настройке, прочитав мануал Установка и защита MongoDB в Ubuntu 16.04.

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

В оболочке укажите, что вы хотите использовать базу данных admin для создания пользователя:

Затем создайте роль и пароль. Для этого добавьте имя пользователя и пароль с помощью команды db.createUser. После ввода этой команды оболочка будет добавлять три точки перед каждой строкой, пока команда не будет выполнена. Обязательно замените указанные здесь имя пользователя и пароль своими данными:

Это создает запись для пользователя 8host в базе данных admin. Выбранное вами имя и база данных admin будут служить идентификаторами вашего пользователя.

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

Создав своего пользователя и пароль, вы можете выйти из оболочки Mongo:

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

2: Добавление информации о Mongoose и базе данных в проект

Нашим следующим шагом будет клонирование исходного кода приложения и добавление в проект данных о Mongoose и нашей БД MongoDB.

В домашний каталог вашего пользователя sudo клонируйте GitHub репозиторий nodejs-image-demo. Этот репозиторий содержит код, который мы также использовали в мануале Сборка приложения Node.js с помощью Docker.

Клонируйте репозиторий в каталог node_project:

git clone https://github.com/do-community/nodejs-image-demo.git node_project

Перейдите в каталог node_project:

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

Примечание: tree – полезная команда для просмотра структур файлов и каталогов из командной строки. Вы можете установить ее с помощью:

sudo apt install tree

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

Введите следующую команду, чтобы просмотреть каталог node_project:

Структура текущего проекта выглядит следующим образом:

├── Dockerfile
├── README.md
├── app.js
├── package-lock.json
├── package.json
└── views
. ├── css
. │ └── styles.css
. ├── index.html
. └── sharks.html

По мере продвижения мы будем добавлять в этот проект каталоги, и tree будет помогать нам отслеживать прогресс.

Затем добавьте в проект npm пакет mongoose с помощью команды npm install:

npm install mongoose

Эта команда создаст в каталоге вашего проекта каталог node_modules, используя зависимости, перечисленные в файле package.json, и добавит mongoose в этот каталог. Она также добавит mongoose к зависимостям, перечисленным в файле package.json. Более подробно о файле package.json рассказывается в разделе 1 мануала Сборка приложения Node.js с помощью Docker.

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

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

Сначала импортируйте модуль mongoose, используя функцию require:

const mongoose = require(‘mongoose’);

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

Затем добавьте следующие константы, чтобы определить информацию для URI подключения Mongo. Хотя имя пользователя и пароль указывать необязательно, мы включим их, чтобы иметь возможность включить обязательную аутентификацию для базы данных. Не забудьте заменить имя пользователя и пароль, указанные ниже, собственными данными. Вы также можете выбрать другое имя БД вместо ‘sharkinfo’:

const mongoose = require(‘mongoose’);
const MONGO_USERNAME = ‘8host’;
const MONGO_PASSWORD = ‘your_password’;
const MONGO_HOSTNAME = ‘127.0.0.1’;
const MONGO_PORT = ‘27017’;
const MONGO_DB = ‘sharkinfo’;

Поскольку мы работаем с базой данных локально, мы использовали в качестве имени хоста 127.0.0.1. В других контекстах разработки это не будет работать: например, если вы используете отдельный сервер базы данных или работаете с несколькими нодами в контейнеризованной среде.

Наконец, определите константу для URI и создайте соединение, используя метод mongoose.connect():

Обратите внимание, что в URI в качестве authSource пользователя указана БД admin. Это необходимо, поскольку ранее мы указали имя пользователя в строке подключения. Флаг useNewUrlParser вместе с mongoose.connect () позволяет использовать новый URL парсер Mongo.

Сохраните и закройте файл, когда закончите редактирование.

Теперь только добавьте информацию о соединении с базой данных в файл app.js, чтобы приложение могло ее использовать. Откройте app.js:

Первые строки файла будут выглядеть так:

const express = require(‘express’);
const app = express();
const router = express.Router();
const path = __dirname + ‘/views/’;
.

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

.
const router = express.Router();
const db = require(‘./db’);
const path = __dirname + ‘/views/’;
.

Это позволяет приложению использовать информацию о соединении с базой данных, указанную в db.js.

Сохраните и закройте файл.

Получив информацию о вашей базе данных и добавив Mongoose в проект, вы можете создавать схемы и модели, которые будут систематизировать данные в вашей коллекции sharks.

3: Создание схем и моделей Mongoose

Теперь нужно подумать о структуре коллекции sharks, которую пользователи будут создавать в БД sharkinfo с помощью своих входных данных. Какую структуру будут иметь эти созданные документы? Страница текущего приложения содержит некоторые сведения о различных акулах и их поведении.

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

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

Затем откройте файл sharks.js, чтобы создать схему и модель:

Импортируйте модуль mongoose в верхней части файла:

const mongoose = require(‘mongoose’);

Ниже определите объект Schema, который будет основой для вашей схемы:

const mongoose = require(‘mongoose’);
const Schema = mongoose.Schema;

Теперь вы можете определить поля, которые вы хотели бы включить в свою схему. Поскольку мы хотим создать коллекцию с отдельными акулами и информацией об их поведении, давайте добавим ключи name и character. Добавьте следующую схему Shark после других определений:

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

Наконец, создайте модель Shark, используя функцию Mongoose model(). Эта модель позволит вам запрашивать документы из коллекции и проверять новые документы. Добавьте следующую строку в конец файла:

.
module.exports = mongoose.model(‘Shark’, Shark)

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

Готовый файл models/sharks.js выглядит следующим образом:

const mongoose = require(‘mongoose’);
const Schema = mongoose.Schema;
const Shark = new Schema ( <
name: < type: String, required: true >,
character: < type: String, required: true >,
>);
module.exports = mongoose.model(‘Shark’, Shark)

Сохраните и закройте файл.

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

4: Создание контроллеров

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

Сначала создайте каталог для контроллера:

Затем откройте в этой папке файл sharks.js:

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

Добавьте следующие функции в начало файла:

const path = require(‘path’);
const Shark = require(‘../models/sharks’);

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

  • Отправка пользователям формы для ввода данных.
  • Создание новой записи.
  • Отображение введенных данных пользователям.

Для начала создайте функцию index для отображения страницы sharks с формой ввода. Добавьте эту функцию после импорта:

.
exports.index = function (req, res) <
res.sendFile(path.resolve(‘views/sharks.html’));
>;

Затем, под функцией index, добавьте функцию create, чтобы сделать новую запись об акуле в вашей коллекции sharks:

.
exports.create = function (req, res) <
var newShark = new Shark(req.body);
console.log(req.body);
newShark.save(function (err) <
if(err) <
res.status(400).send(‘Unable to save shark to database’);
> else <
res.redirect(‘/sharks/getshark’);
>
>);
>;

Эта функция вызывается, когда пользователь публикует данные об акуле в вашей форме на странице sharks.html. Мы создадим маршрут с этой конечной точкой POST позже, когда создадим маршруты приложения. В теле POST запроса функция create создаст новый объект документа shark (здесь он называется newShark), используя импортированную модель Shark. Мы добавили метод console.log для вывода записей на консоль, чтобы убедиться, что метод POST работает как задумано, но вы можете его не использовать, если не хотите.


Используя объект newShark, функция create затем вызовет метод Mongoose model.save() для создания нового документа с использованием ключей, которые вы определили в модели Shark. Эта функция обратного вызова следует стандартному шаблону Node: обратный вызов (ошибка, результаты). В случае ошибки приложение отправит нашим пользователям сообщение об ошибке, а в случае успеха оно использует метод res.redirect() для отправки пользователей в конечную точку, которая будет отображать введенную ими информацию обратно в их браузере.

Наконец, функция list отобразит содержимое коллекции на экране пользователя. Добавьте следующий код после функции create:

.
exports.list = function (req, res) <
Shark.find(<>).exec(function (err, sharks) <
if (err) <
return res.send(500, err);
>
res.render(‘getshark’, <
sharks: sharks
>);
>);
>;

Эта функция использует модель Shark с методом model.find() для возврата информации, которая была введена в коллекцию. Для этого она возвращает объект запроса – в данном случае все записи в коллекции – используя функцию exec() Mongoose. В случае ошибки функция обратного вызова отправит ошибку 500.

Возвращенный объект запроса с коллекцией sharks будет отображен на странице getshark, которую мы создадим на следующем этапе с помощью языка шаблонов EJS.

Готовый файл будет выглядеть так:

const path = require(‘path’);
const Shark = require(‘../models/sharks’);
exports.index = function (req, res) <
res.sendFile(path.resolve(‘views/sharks.html’));
>;
exports.create = function (req, res) <
var newShark = new Shark(req.body);
console.log(req.body);
newShark.save(function (err) <
if(err) <
res.status(400).send(‘Unable to save shark to database’);
> else <
res.redirect(‘/sharks/getshark’);
>
>);
>;
exports.list = function (req, res) <
Shark.find(<>).exec(function (err, sharks) <
if (err) <
return res.send(500, err);
>
res.render(‘getshark’, <
sharks: sharks
>);
>);
>;

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

Сохраните и закройте файл.

Прежде чем перейти к следующему этапу, вы можете снова запустить tree из каталога node_project, чтобы просмотреть структуру проекта на этом этапе. На этот раз для краткости опустите каталог node_modules, используя опцию -I:

tree -I node_modules

С внесенными дополнениями структура вашего проекта будет выглядеть так:

├── Dockerfile
├── README.md
├── app.js
├── controllers
│ └── sharks.js
├── db.js
├── models
│ └── sharks.js
├── package-lock.json
├── package.json
└── views
. ├── css
. │ └── styles.css
. ├── index.html
. └── sharks.html

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

MongoDB. Урок 4. Сохранение модели

Models are fancy constructors compiled from Schema definitions. An instance of a model is called a document. Models are responsible for creating and reading documents from the underlying MongoDB database.

Compiling your first model

When you call mongoose.model() on a schema, Mongoose compiles a model for you.

The first argument is the singular name of the collection your model is for. ** Mongoose automatically looks for the plural, lowercased version of your model name. ** Thus, for the example above, the model Tank is for the tanks collection in the database.

Note: The .model() function makes a copy of schema . Make sure that you’ve added everything you want to schema , including hooks, before calling .model() !

Constructing Documents

An instance of a model is called a document. Creating them and saving to the database is easy.

Note that no tanks will be created/removed until the connection your model uses is open. Every model has an associated connection. When you use mongoose.model() , your model will use the default mongoose connection.

If you create a custom connection, use that connection’s model() function instead.

Querying

Finding documents is easy with Mongoose, which supports the rich query syntax of MongoDB. Documents can be retreived using each models find, findById, findOne, or where static methods.

See the chapter on queries for more details on how to use the Query api.

Топ-пост этого месяца:  Урок 11. Webpack 4+. Компиляция React JSX

Deleting

Models have static deleteOne() and deleteMany() functions for removing all documents matching the given filter .

Updating

Each model has its own update method for modifying documents in the database without returning them to your application. See the API docs for more detail.

If you want to update a single document in the db and return it to your application, use findOneAndUpdate instead.

Change Streams

New in MongoDB 3.6.0 and Mongoose 5.0.0

Change streams provide a way for you to listen to all inserts and updates going through your MongoDB database. Note that change streams do not work unless you’re connected to a MongoDB replica set.

The output from the above async function will look like what you see below.

Yet more

The API docs cover many additional methods available like count, mapReduce, aggregate, and more.

Next Up

Now that we’ve covered Models , let’s take a look at Documents.

Введение в Mongoose для MongoDB и Node.js

Russian (Pусский) translation by AlexBioJS (you can also view the original English article)

Mongoose — это библиотека JavaScript, часто используемая в приложении Node.js с базой данных MongoDB. В данной статье я собираюсь познакомить вас с Mongoose и MongoDB и, что более важно, показать, где их уместно использовать в вашем приложении.

Что такое MongoDB?

Для начала рассмотрим MongoDB. MongoDB — это база данных, которая хранит ваши данные в виде документов. Как правило, эти документы имеют JSON (* JavaScript Object Notation — текстовый формат обмена данными, основанный на JavaScript. Здесь и далее примеч. пер.) — подобную структуру:

Затем документ помещается внутрь коллекции. Например, в вышеуказанном примере документа определяется объект user . Далее этот объект user стал бы, скорее всего, частью коллекции под названием users .

Одна из основных особенностей MongoDB — гибкость структуры её данных. Несмотря на то, что в первом примере объект user имел свойства firstName и lastName , эти свойства могут отсутствовать в других документах user коллекции users . Именно это отличает MongoDB от баз данных SQL (* structured query language — язык структурированных запросов), например, MySQL или Microsoft SQL Server, в которых для каждого объекта, хранящегося в базе данных, необходима фиксированная схема.

За счет способности создавать динамические объекты, которые сохраняются в виде документов в базе данных, в игру вступает Mongoose.

Что такое Mongoose?

Mongoose — это ODM (* Object Document Mapper — объектно-документный отобразитель). Это означает, что Mongoose позволяет вам определять объекты со строго-типизированной схемой, соответствующей документу MongoDB.

Mongoose предоставляет огромный набор функциональных возможностей для создания и работы со схемами. На данный момент Mongoose содержит восемь SchemaTypes (* типы данных схемы), которые может иметь свойство, сохраняемое в MongoDB. Эти типы следующие:

  1. String
  2. Number
  3. Date
  4. Buffer
  5. Boolean
  6. Mixed
  7. ObjectId (* уникальный идентификатор объекта, первичный ключ, _id)
  8. Array

Для каждого типа данных можно:

  • задать значение по умолчанию
  • задать пользовательскую функцию проверки данных
  • указать, что поле необходимо заполнить
  • задать get-функцию (геттер), которая позволяет вам проводить манипуляции с данными до их возвращения в виде объекта
  • задать set-функцию (* сеттер), которая позволяет вам проводить манипуляции с данными до их сохранения в базу данных
  • определить индексы для более быстрого получения данных

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

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

Для свойств типа Number и Date можно задать минимально и максимально допустимое значение.

Большинство из восьми допустимых типов данных должны быть вам хорошо знакомы. Однако, некоторые ( Buffer , Mixed , ObjectId и Array ) могут вызвать затруднения.

Тип данных Buffer позволяет вам сохранять двоичные данные. Типичным примером двоичных данных может послужить изображение или закодированный файл, например, документ в PDF-формате (* формат переносимого документа).

Тип данных Mixed используется для превращения свойства в «неразборчивое» поле (поле, в котором допустимы данные любого типа). Подобно тому, как многие разработчики используют MongoDB для различных целей, в этом поле можно хранить данные различного типа, поскольку отсутствует определенная структура. С осторожностью используйте этот тип данных, поскольку он ограничивает возможности, предоставляемые Mongoose, например, проверку данных и отслеживание изменений сущности для автоматического обновления свойства при сохранении.

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

Тип данных Array позволяет вам сохранять JavaScript-подобные массивы. Благодаря этому типу данных вы можете выполнять над данными типичные JavaScript операции над массивами, например, push, pop, shift, slice и т.д.

Краткое повторение

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

Mongoose — это библиотека JavaScript, позволяющая вам определять схемы со строго-типизированными данными. Сразу после определения схемы Mongoose дает вам возможность создать Model (модель), основанную на определенной схеме. Затем модель синхронизируется с документом MongoDB с помощью определения схемы модели.

Сразу после определения схем и моделей вы можете пользоваться различными функциями Mongoose для проверки, сохранения, удаления и запроса ваших данных, используя обычные функции MongoDB. Мы еще рассмотрим это более подробно на конкретных примерах.

Установка MongoDB

До того, как начать создавать схемы и модели Mongoose, нам необходимо установить и настроить MongoDB. Я бы порекомендовал вам зайти на страницу загрузки MongoDB. Имеется несколько различных вариантов установки. Я выбрал Community Server. Данный вариант позволяет вам установить версию, предназначенную именно для вашей операционной системы. Также MongoDB предлагает вариант Enterprise Server и вариант облачной установки. Поскольку целые книги можно было бы написать об установке, настройке и мониторинге MongoDB, я остановился на варианте Community Server.

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

Я подожду вас, пока вы настроите MongoDB. Как только вы справились с вышесказанным, мы можем перейти к инсталляции Mongoose для соединения с вашей только что установленной базой данных MongoDB.

Установка Mongoose

Mongoose — это библиотека JavaScript. Я собираюсь использовать её в приложении Node.js. Если у вас уже установлен Node.js, то вы можете перейти к следующему разделу. Если же не установлен, я рекомендую вам начать с посещения страницы загрузки Node.js и выбора установщика для вашей операционной системы.

Как только Node.js установлен и настроен, я собираюсь создать новое приложение и затем установить npm (* диспетчер пакетов Node) модуль Mongoose.

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

При инициализации моего приложения я оставил значения всех запрашиваемых параметров по умолчанию. Теперь я установлю модуль mongoose следующим образом:

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

В первой строке кода мы подключаем библиотеку mongoose . Далее я открываю соединение с базой данных, которую я назвал mongoose_basics , используя функцию connect .

Функция connect принимает еще два других необязательных параметра. Второй параметр — объект опций, где вы можете указать, при необходимости, например, username (имя пользователя) и password (пароль). Третий параметр, который также может быть и вторым, если у вас не определены опции, — это функция обратного вызова, которая будет вызвана после попытки соединения с базой данных. Функцию обратного вызова можно использовать двумя способами:

Чтобы избежать потенциальной необходимости введения в JavaScript Promises, я буду использовать первый способ. Ниже приводится обновленный index.js::

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

Теперь Mongoose установлена и подключена к базе данных под названием mongoose_basics . Мое соединение с MongoDB не использует ни username, ни password, ни пользовательского порта. Если вам необходимо указать эти опции или любую другую при подключении, я рекомендую вам просмотреть документацию Mongoose по подключению. В документации дается объяснение как многих доступных опций, так и процесса создания нескольких соединений, объединения соединений, реплик и т.д.

После удачного соединения давайте перейдем к определению схемы.

Определение Mongoose Schema (* схемы)

В начале статьи я показал вам объект user , который имел два свойства: firstName и lastName . В следующем примере я переделал этот документ в схему:

Это очень простая схема, которая содержит всего лишь два свойства без атрибутов, связанных с ней. Давайте распространим наш пример, сделав свойства first и last name дочерними объектами свойства name . Свойство name будет содержать свойства first и last name. Также я добавлю свойство created типа Date .

Как вы видите, Mongoose позволяет мне создавать очень гибкие схемы со множеством возможных комбинаций организации данных.

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

Выше приводится схема author , которая распространяет схему user , что я создал в предыдущем примере. Чтобы связать Author и Book, в схеме author первым свойством указываем _id типа ObjectId . _id — это стандартный синтаксис для обозначения первичного ключа в Mongoose и MongoDB. Далее, как и в схеме user , я определил свойство name , содержащее first и last name автора.

Распространяя схему user , схема author содержит несколько дополнительных свойств типа String . Также я добавил свойство типа Buffer , в котором можно было бы расположить изображение профиля автора. Последнее свойство содержит дату создания автора; однако, вы можете обратить внимание, что оно создано немного по-иному, так как в нем указано значение по умолчанию «сейчас». При сохранении автора в базу данных, данному свойству будет присвоено значение текущей даты/времени.

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

Схема book содержит несколько свойств типа String . Как было упомянуто ранее, эта схема содержит ссылку на схему author . Схема book также содержит свойство ratings типа Array , чтобы продемонстрировать вам возможности определения схем. Каждый элемент этого массива содержит свойства summary , detail , numberOfStars и created date.

Mongoose дает вам возможность создавать схемы со ссылками на другие схемы или, как в примере выше со свойством ratings , позволяет создавать Array дочерних свойств, который может содержаться в привязанной схеме (author в нашем примере) или же в текущей схеме, как в примере выше (схема book со свойством ratings типа Array ).

Создание и сохранение Mongoose Models (* моделей)

Поскольку на примере схем author и book мы увидели гибкость схемы Mongoose, я собираюсь продолжить использовать их и создать на их основе модели Author и Book .

После сохранения модели в MongoDB создается Document (* документ) с теми же свойствами, что определены в схеме, на основе которой была создана модель.

Чтобы продемонстрировать создание и сохранение объекта, в следующем примере я собираюсь создать несколько объектов: одну модель Author и несколько моделей Book . Сразу после создания эти объекты будут сохранены в MongoDB при помощи метода модели save .

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

Для создания ссылки на Author, оба объекта book ссылаются на первичный ключ _id схемы author в свойстве author схемы book .

Проверка данных перед сохранением

Общепринято наполнение данных для создания модели в форме на веб-странице. По этой причине, хорошо бы проверить эти данные перед сохранением модели в MongoDB.

В следующем примере я обновил предыдущую схему author, добавив проверку данных следующих свойств: firstName , twitter , facebook и linkedin .

Для свойства firstName был задан атрибут required . Теперь при вызове функции save , Mongoose вернет ошибку с сообщением о необходимости указания значения свойства firstName . Я решил сделать свойство lastName без необходимости указания его значения на случай, если авторами в моей базе данных были бы Cher или Madonna (* отсутствует фамилия).

Для свойств twitter , facebook и linkedin используются подобные пользовательские валидаторы. Они проверяются на соответствие начала их значений соответствующему доменному имени социальных сетей. Поскольку это необязательные для заполнения поля, валидатор применяется только в случае поступления данных для этого свойства.

Поиск и обновление данных

Введение в Mongoose не было бы завершенным без примера поиска записи и обновления одного или более свойств этого объекта.

Mongoose предоставляет несколько различных функций для поиска данных определенной модели. Эти функции следующие: find , findOne и findById .

Функции find и findOne получают в качестве аргумента объект, позволяющий осуществлять сложные запросы. Функция же findById получает только одно значение функции обратного вызова (скоро будет пример). В следующем примере я продемонстрирую вам, как можно сделать выборку книг, содержащих в своем названии строку ‘mvc’.

Внутри функции find я осуществляю поиск нечувствительной к регистру строки ‘mvc’ по свойству title . Это осуществляется с помощью того же синтаксиса, что используется для поиска строки в JavaScript.

Функцию find таккже можно «прицепить» к другим методам запроса, например, where , and , or , limit , sort , any и т.д.

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

После применения функции find порядок последующих функций не имеет значения, поскольку из всех сцепленных функций формируется единый запрос и функции не выполняются до вызова функции exec .

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

У вас значение _id может быть немного другим. Я скопировал значение _id из предыдущего console.log , когда осуществляли поиск книг, содержащих в названии строку ‘mvc’.

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

После успешного получения автора устанавливается значение свойства linkedin и вызывается функция save . Mongoose способна заметить изменение свойства linkedin и передать состояние, обновленное только по модифицированным свойствам, в MongoDB. В случае возникновения ошибки при сохранении будет выброшено исключение и приложение прекратит работу. При отсутствии ошибок в консоль будет выведено сообщение об успешном изменении.

Также Mongoose предоставляет возможность найти объект и сразу обновить его при помощи функций с соответствующими названиями: findByIdAndUpdate и findOneAndUpdate . Давайте обновим предыдущий пример, чтобы показать функцию findByIdAndUpdate в действии.

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

Полный код примера

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

Для начала я создал два дополнительных файла: author.js и book.js . Данные файлы содержат соответствующие оределения схем и создание моделей. Последняя строка кода делает модель доступной для использования в файле index.js .

Давайте начнем с файла author.js:

Далее переходим к файлу book.js :


И, наконец, обновленнй файл index.js :

В вышеуказанном примере все действия Mongoose содержатся внутри функции connect . Файлы author и book подключаются при помощи функции require после подключения mongoose .

Если MongoDB запущена, вы теперь можете запустить полное приложение Node.js при помощи следующей команды:

После сохранения некоторых данных в базу я обновил файл index.js , добавив функции поиска, следующим образом:

Опять-таки, вы можете запустить приложение при помощи следующей команды: node index.js .

Резюме

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

Надеюсь, теперь вы чувствуете себя уверенным пользователем Mongoose. Если вы хотите узнать больше о Mongoose, я бы рекомендовал вам изучить Mongoose Guides, в котором объясняются более продвинутые темы, например, population, middleware, promises и т.д.

Подробное руководство по MongoDB, Mongoose

Введение

MongoDB состоит из БД, которые состоят из коллекций. Коллекции, в свою очередь, состоят из документов. Каждый документ состоит из полей.
www.mongodb.com

MongoDB клиенты

Конфиг mongodb для windows

В папке bin создайте файл и назовите его mongodb.config .

Указываем в этом файле путь, где будем хранить БД, например, для windows:

Запуск

  • mongod — это сервер баз данных MongoDB. Он обрабатывает запросы, управляет форматом данных и выполняет различные операции в фоновом режиме по управлению БД. Командная строка отобразит нам ряд служебной информации, например, что сервер запускается на localhost на порту 27017 .
  • mongo — клиентская консоль для взаимодействия с базами данных.
  • mongodump — утилита создания бэкапа БД.
  • mongorestore — позволяет записывать данные из дампа, созданного mongodump , в новую или существующую БД.

Стартуем mongod (сервер):

Подключаемся к запущенному серверу

Команда mongo позволяет подключиться к запущенному серверу (стартуем mongo оболочку/shell).

Работаем с БД

Выводим все БД в mongo:

Переходим (и одновременно создаем) к нужной БД

Команды db возвращает имя БД, внутри которой мы сейчас находимся:

Коллекции

Показать все коллекции в БД

Метод find()

Показать весь контент нужной коллекции:

Метод pretty выводит результат в удобном для чтения виде.

Метод count()

Метод count выводит количество документов в коллекции:

Метод remove()

Метод remove используется, чтобы удалить документ из коллекции (или всю коллекцию).

Метод insert()

Заносим данные в коллекцию band (создаем тем самым коллекцию band , если ее нет):

Добавим составы груп в коллекцию band :

Мы можем добавлять данные, не декларируя их предварительно: свойство members . Отсутствует схема: легко добавили массив объектов.

Мы не обязаны создавать коллекции явно. Мы просто можем вставить документ в новую коллекцию. Чтобы это сделать, используйте команду insert , передав ей вставляемый документ:

Модификация данных

Оператор $set

Оператор $set заставляет команду update модифицировать лишь те ключи, которые ему переданы (см. пример выше).

Оператор $unset

Оператор $unset удаляет указанный ключ

Оператор $inc

Оператор $inc увеличивает значение поля на указанную величину

Оператор $rename

Оператор $rename позволяет переименовать поля

Индексы

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

Индексы MongoDB – это специальные структуры данных, которые хранят небольшие части данных в форме, которая легко распознаётся. Они хранят значение определённого поля или набора полей, упорядоченных по значению поля, указанному в индексе.

Построим индекс по ключу bid :

ensureIndex устарел, начиная с версии 3.0, в данный момент является псевдонимом для db.collection.createIndex() .

Схемы и модели

Схемы определяют структуру документов внутри коллекции, а модели используются для создания копий данных, хранящихся в документах.

Основы MongoDB

  • 1 Внутри MongoDB может быть ноль или более баз данных.
  • 2 База данных может иметь ноль или более «коллекций» (коллекция практически тоже что и таблица).
  • 3 Коллекции состоят из нуля или более «документов». Опять же, документ можно рассматривать как «строку».
  • 4 Документ состоит из одного или более «полей», которые — как можно догадаться — подобны «колонкам».
  • 5 «Индексы» в MongoDB почти идентичны таковым в реляционных базах данных.
  • 6 Важно понимать, что когда мы запрашиваем у MongoDB какие-либо данные, то она возвращает курсор, с которыми мы можем делать все что угодно.

Отличия MongoDB от реляционных БД

Основное различие в том, что реляционные базы данных определяют «колонки» на уровне «таблицы», в то время как документ-ориентированные базы данных определяют «поля» (в реляционных «колонки») на уровне «документа» (в релационных «запись»).

В конечном счёте дело в том, что коллекция не содержит информации о структуре содержащихся в ней данных. Информацию о полях содержит каждый отдельный документ.

Топ-пост этого месяца:  Урок 12. Курс по ООП PHP. Автозагрузка и пространства имен

Селекторы запросов

Селектор запросов MongoDB (это JSON-объект) аналогичен предложению where SQL-запроса. Как таковой он используется для поиска, подсчёта, обновления и удаления документов из коллекций.

Селектор — это JSON-объект, в простейшем случае это может быть даже <> , что означает выборку всех документов (аналогичным образом работает null ). Если нам нужно выбрать всех единорогов (англ. «unicorns») женского рода, можно воспользоваться селектором .

<поле: значение>используется для поиска всех документов, у которых есть ‘поле’ и у него есть ‘значение’.

Оператор $lt, $lte, $gt, $gte, $ne

Специальные операторы $lt , $lte , $gt , $gte и $ne используются для выражения операций «меньше», «меньше или равно», «больше», «больше или равно», и «не равно».

Пример использовани селекторов с командой find (но также селекторы могут быть использованы с remove , count , update ):

Например, чтобы получить всех самцов единорога, весящих более 700 фунтов, мы можем написать:

Оператор $exists

Оператор $exists используется для проверки наличия или отсутствия поля, например:

Оператор $or

Оператор $or используется как ИЛИ

Поле loves это массив. MongoDB поддерживает массивы как объекты первого класса. Самое интересное это та простота, с которой делается выборка по значению массива: вернёт нам все документы, у которых watermelon является одним из значений поля loves .

Оператор $where

Оператор $where (в след. разделах)

Самый гибкий оператор — $where , позволяющий нам передавать JavaScript для его выполнения на сервере.

Оператор ObjectId

ObjectId , сгенерированный MongoDB для поля _id , подставляется в селектор следующим образом:

update

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

По умолчанию, update обновляет лишь первый найденный документ

Модификатор $set

Модификатор $set обновляет конкретные поля, а не весь документ.

Если вам нужно всего лишь изменить пару полей, лучше всего использовать модификатор $set :

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

модификатор $inc

Модификатор $inc — увеличить или уменьшить значение поля. Модификатор воздействуют непосредственно на поля, а не на весь документ.

Модификатор $push

Модификатор $push — позволяет добавить данные в массив. Модификатор воздействуют непосредственно на поля, а не на весь документ.

Разрешаем вставку при обновлении (3-й параметр)

Обновление/вставка: обновляет документ, если он найден, или создаёт новый — если не найден. Чтобы разрешить вставку при обновлении (если элемент не будет найден), установите третий параметр в true .

Вставки и обновления не будет, так как 3-й параметр опущен, а документа с отсутствует в коллекции.

Поскольку документы с полем page , равным unicorns , не существуют, то будет создан новый документ. Если выполнить это вторично, существующий документ будет обновлён, и поле hits увеличится до 2.

Одновременно создастся коллекция hits , если она отсутствует.

Множественные обновления (4-й параметр)

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

Этим мы обновили все поля добавив везде поле vaccinated со значением true

find (курсор)

Курсор базы данных — это объект БД, который позволяет приложениям работать с записями «по-одной», а не с множеством сразу. То есть курсор (как мы помним это объект), который позволяет передвигаться по выборке (назад на одно, вперед на одну, в конец/начало) при помощи своих методов.

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

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

Получаем все поля, кроме поля name :

Как уже упоминалось, результатом find является курсор. Поэтому мы можем присоединить к нему ряд методов:

Сортировка (метод sort)

Синтаксис метода sort: мы указываем поля, по которым надо сортировать, используя 1 для сортировки по возрастанию и -1 для сортировки по убыванию. Например:

Но для сортировки большого объема данных в MongoDB необходимо использовать индексы.

Метод limit()

Метод skip()

Метод skip() позволяет пропустить определенное количество записей.

Обратите внимание как мы соединяем методы в цепочки.

Моделирование данных

MongoDB не поддерживает JOIN . По существу мы должны делать второй запрос, чтобы найти связанные данные.

p.s: Для создания нового ObjectID используется следующий код: NewObject >

Моделируем ‘один-ко-многим’ или ‘многие-ко-многим’


Когда требуется смоделировать отношения «один-ко-многим» или «многие-ко-многим» можно использовать массивы ( в MongoDB массивы это объекты первого класса).

При этом следующий find сработает:

Массивы значений намного удобнее в использовании, нежели таблицы связи «многие-ко-многим»

Вложенные документы

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

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

Денормализация

Традиционный путь ассоциировать пользователя с его постом — это колонка userid в таблице posts . С такой моделью нельзя отобразить список постов без дополнительного извлечения данных (JOIN) из таблицы пользователей. Возможное решение — хранить имя пользователя ( name ) вместе с userid для каждого поста.

Команды (выжимка)

Подключение MongoDB в Node.js

Mongoose

ODM – Object-Document Mapper (объектно-документное отображение). У MongoDB нет жесткой структуры, а вот Mongoose позволяет нам ввести понятие схемы.

Установка и подключение (работаем через mongoose)

Установка и подключение (работаем через нативный клиент — MongoClient)

Схема

Схема в Mongoose определяет метаданные модели — ее свойства, типы данных и ряд другой информации. mongoosejs.com/docs/guide.html

Типы схем

Модель

Модели (http://mongoosejs.com/docs/models.html) — это конструкторы, составленные из определения нашей схемы. Экземпляры модели представляют собой документы, которые могут быть сохранены и извлечены из нашей БД.

Первый параметр в методе mongoose.model указывает на название модели, а второй параметр — схема.

Сохраняем объект в БД

Кроме метода save() также можно использовать метод Person.create() (см. код ниже). Первый параметр метода — сохраняемый объект.

Поиск (find, findById, findOne)

Методы Для получения данных:

find — возвращает все объекты, которые соответствуют условию фильтрации. find() в качестве первого параметра принимает условие фильтрации; второй параметр метода find() — функция обратного вызова, в которую передаются полученные из БД документы. Если в качестве условия фильтрации передаются пустые фигурные скобки ( <> ), то возвращаются все объекты.

findById — возвращает один объект по значению поля _id . Метод возвращает документ с определенным идентификатором.

findOne — возвращает один объект, который соответствует критерию фильтрации. В отличие от метода find , метод findOne() возвращает один объект.

Редактирование (update, findByIdAndUpdate)

Каждая модель имеет метод update() , который позволяет обновить документы в БД. Первый параметр метода — условие фильтрации. Второй параметр описывает, что и как надо изменить. В функцию обратного вызова передается результат операции.

Нередко для обновления используется фильтрация по _id . И на этот случай мы можем использовать метод findByIdAndUpdate() .

Первый параметр метода findByIdAndUpdate() — значения для поля _id у обновляемого документа, а второй — набор новых значений для полей объекта. В функцию обратного вызова передается обновленный документ.

Удаление (remove, findOneAndRemove)

Для удаления применяется метод remove() . В метод remove() передается критерий фильтрации документов на удаление. Объект, который передается в функцию обратного вызова, содержит информацию об операции удаления.

Метод findOneAndRemove() позволяет удалить один документ. В функцию обратного вызова метод findOneAndRemove() передается удаленный документ.

И частная разновидность этого метода — удаление по полю _id в виде метода findByIdAndRemove() .

Валидация в Mongoose

Mongoose имеет ряд встроенных правил валидации, которые следует указывать в схеме:

  • required — обязательно наличие значения для свойства.
  • min и max — задают минимальное и максимальное значения для числовых данных.
  • minlength и maxlength — задают минимальную и максимальную длину для строк.
  • enum — строка должна представлять одно из значений в указанном массиве строк.
  • match — строка должна соответствовать регулярному выражению.

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

Promise и Mongoose

С MongoDB можно использовать Promise .

С помощью метода then мы можем получить данные, которые возвратил нам сервер и выполнить обработку результата.

mlab.com

mlab.com — это облачный сервис по предоставлению БД mongoDB.

  • Создаем БД
  • Добавляем пользователя
  • И подключаемся в своем приложении:

CRUD — (create, read, update, delete — «создание, чтение,обновление, удаление») — 4 основные функции, используемые при работе базами данных.

Создание и сохранение записи модели на MongoDB

Сейчас я нахожусь в разделе MongoDB и Mongoose FreeCodeCamp.

Упражнение требует от пользователя создания экземпляра документа с использованием конструктора Person, который вы строили ранее. Передайте конструктору объект, имеющий имена полей, возраст и избранные файлы. Их типы должны соответствовать тем, которые указаны в схеме персонажа. Затем вызовите метод document.save() в возвращаемом экземпляре документа. Передайте ему обратный вызов, используя соглашение Node.

Я создал персональную схему и конструктор, но я не слишком уверен в том, чего до сих пор не хватает, и как собрать все это вместе для реализации решения. Может кто-то помочь прояснить?

Я не изучал метод, который вы только что использовали. Но у мангуста есть собственный метод create (obj, callback), который делает большую часть работы для вас. Вы можете использовать его следующим образом:

MongoDB для начинающих: знакомство и установка (часть 1/3)

MongoDB — это система управления базами данных, которая значительно отличается от MySQL. Основная разница заключается в том, что в MySQL запросы пишутся на языке SQL, а в MongoDB на BSON (бинарный JSON). Это значит, что работа с этой системой может осуществляться в основном через JavaScript выражения.

Также MongoDB включает в себя собственную утилиту для выполнения команд, направленных на работу с БД. В данном цикле статей, мы затронем следующие темы:

  • Установка и запуск MongoDB на Windows
  • Работа с MongoDB через консоль
  • Интеграция MongoDB и PHP

Разработчикам не составляет труда быстро освоить работу с Mongo, если они знакомы с JSON. Этот формат использует выражения, которые состоят из пар “ключ”: “значение”.

Почему MongoDB

Между не табличными СУБД многие пользователи делают выбор в пользу MongoDB. Во-первых, данную систему можно установить практически на всех операционных системах (Windows, OSX, Linux). Во-вторых, проект до сих пор активно развивается и с завидной частотой команда разработчиков публикует обновления. Также мне кажется, что MongoDB предоставляет хорошую документацию для начинающих.

MongoDB лучше подходит в тех случаях, когда таблицы можно представить в виде объектов. По-моему, подобные системы лучше использовать при разработке приложений для мобильный устройств. В этом плане, Mongo предоставляет отдельные библиотеки, как для iOS, так и для Adndroid-а.

Ещё один весомый аргумент в пользу MongoDB: работать с данной системой можно на многих языках программирования, таких как C/C++, Python, PHP, Rubym Perl, .NET и даже Node.js.

MongoDB — это реальное решение, если вы хотите отступить от SQL и попробовать что-то новенькое.

Ключевая терминология

Перед тем как приступить к установке MongoDB, давайте разберёмся с основными понятиями.

Как и MySQL, MongoDB может содержать множество баз данных, только вместо таблиц они содержат “коллекции”.

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

Пример:

Внутри коллекции Users (пользователи) может располагаться запись с ключами firstname (имя) и lastname (фамилия). В то же время, та же коллекция может содержать запись с другими ключами: firstname, lastname, e-mail, birth (день рождения). В этом-то и заключается гибкость MongoDB.

Каждая из этих записей, или строк, называется “документ”, но это не тот документ типа .txt или .html. Данная запись хранится в памяти в JSON формате.

Пример:

Предположим, в нашей коллекции содержится 500 документов. Как уже говорилось раньше, каждый из них может содержать разные поля. Единственное поле, которое должно быть у каждой записи, — это уникальный идентификатор (id), который добавляется автоматически.

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

Установка MongoDB на Windows

Сперва качаем архив с MongoDB для win32 или win64.

Распаковываем скачанный архив и помещаем его, к примеру, на диск C, в каталог mongodb. Причём, проследите за тем, чтобы каталог bin был доступен по адресу C:\mongodb\bin .

Далее прописываем путь к папке bin в настройках нашей ОС, для того чтобы к .exe файлам данной папки мы могли достучаться из любого места. Итак, делаем правый клик на Компьютер — Свойства. В списке слева, выбираем “Дополнительные параметры системы”:

Далее, нажимаем на кнопку “Переменные среды”:

В открывшемся окне ищем системную переменную Path. Кликаем по ней дважды. В поле “значение переменной” переходим в самый конец, ставим знак “;” и вписываем путь к каталогу bin:

Отлично! Жмём “ок”. и переходим к следующему шагу.

Для начала, нам необходимо создать каталог, где будут храниться наши БД. К примеру, C:\databases . Создаём эту папку.

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

Данная команда создаст специальный лог файл и настройки конфигурации для сервиса.

Далее создаём сервис:

Прежде чем запустить его, давайте отредактируем файл mongod.cfg , вписав туда настройку dbpath — путь к папке с нашими базами данных. В моём случае, после правки файла его содержание должно выглядеть примерно так:

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

Для того чтобы проверить, будет ли сервис запускаться автоматически, нажимаем сочетание клавиш “windows+r”, пишем “services.msc”, нажимаем ОК.

В списке сервисов ищем MongoDB и, если его тип запуска не автоматический, то выставляем данный пункт, предварительно сделав правый клик, и выбрав, “свойства”.

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

Для проверки работы MongoDB открываем командную строку и пишем:

Нажимаем Enter. Далее можем работать с данной СУБД. К примеру, посмотрим, какие сейчас у нас есть базы:

В ответе вы должны увидеть вот такую вот строку:

Итак, MongoDB установлена и сконфигурирована. В следующей части мы рассмотрим основные команды для работы с данной СУБД.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://www.hongkiat.com/blog/webdev-with-mongodb-part1/
Перевел: Станислав Протасевич
Урок создан: 3 Апреля 2013
Просмотров: 99345
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Доступ к данным в MongoDB

Этот урок освещает процесс создания приложения, которое использует Spring Data MongoDB для сохранения и получения данных из документоориентированной БД MongoDB.

Что вы создадите

Вы создадите приложение, которое сохраняет Person POJO в БД MongoDB, используя Spring Data MongoDB.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Gradle 1.11+ или Maven 3.0+
  • Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.

Как проходить этот урок

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

Чтобы начать с нуля, перейдите в Настройка проекта.

Чтобы пропустить базовые шаги, выполните следующее:

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git
  • Перейдите в каталог gs-accessing-data-mongodb/initial
  • Забегая вперед, установите и запустите MongoDB

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-accessing-data-mongodb/complete .

Настройка проекта

Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

Создание файла сборки Gradle

Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.


Spring Boot gradle plugin предоставляет множество удобных возможностей:

  • Он собирает все jar’ы в classpath и собирает единое, исполняемое «über-jar», что делает более удобным выполнение и доставку вашего сервиса
  • Он ищет public static void main() метод, как признак исполняемого класса
  • Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий

Установка и запуск MongoDB

Настроив проект, вы можете установить и запустить MongoDB БД.

Если вы используете Mac с homebrew, то выполните:

Для других систем с управлением пакетами, таких как RedHat, Ubuntu, Debian, CentOS и Windows смотрите инструкции.

После установки MongoDB, запустите её из консоли. Эта команда также запускает серверный процесс.

Вероятнее всего вы увидите не более чем это:

Описание простой сущности

MongoDB является NoSQL хранилищем документов. В этом примере вы сохраняете Customer объекты.

Здесь у вас есть класс Customer с тремя атрибутами id , firstName и lastName . id в основном нужен для внутреннего использования MongoDB. У вас также конструктор для создания экземпляра Customer , чтобы сохранить его в БД.

Свойство id соответствует стандартному названию для MongoDB идентификатору и не требует какой-либо специальной аннотации для обозначения к Spring Data MongoDB.

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

Метод tostring будет печатать свойства объекта.

Создание простых запросов

Spring Data MongoDB ориентирован на сохранение данных в MongoDB. Он также наследует функциональность от проекта Spring Data Commons, такую как возможность создавать запросы. Фактически, вам не нужно изучать язык запросов MongoDB; вы можете просто написать немножко методов и запросы будут написаны за вас.

Чтобы увидеть, как это работает, создайте интерфейс репозитория, который работает с сущностями Customer :

CustomerRepository расширяет MongoRepository интерфейс и содержит тип сущности и ID, Customer и String . «Из коробки», этот интерфейс имеет множество операций, включая стандартные CRUD операции(создание-чтение-обновление-удаление).

Вы можете определить другие запросы, просто описав их сигнатуры методов запросов. В данном случае, вы добавляете метод findByFirstName() , который ищет документ типа Customer , соответствующий критерию по firstName .

Также у вас есть метод findBylastName для поиска списка людей по фамилии.

В типичном Java приложении, вы бы написали класс, который реализовывал CustomerRepository . Но это то, что делает Spring Data MongoDB мощным инструментом: вам не нужно писать реализацию интерфейса репозитория. Spring Data MongoDB создает реализацию на лету, когда вы запускаете приложение.

Приступим к работе и посмотрим, что он найдет!

Создание класса Application

Создайте класс Application со всеми компонентами.

В конфигурацию вам необходимо добавить только аннотацию @EnableAutoConfiguration , т.к. репозиторий расположен в том же пакете; Spring Boot будет обрабатывать те репозитории автоматически, которые включены в тот же пакет(или подпакет), что и класс, аннотированный @EnableAutoConfiguration . Для большего контроля процессом регистрации вы можете использовать аннотацию @EnableMongoRepositories .

Spring Data MongoDB использует MongoTemplate для выполнения запросов ваших find* методов. Вы можете использовать свой шаблон для более сложных запросов, но в этом уроке это не освещается.

Application включает метод main() , который инициализирует CustomerRepository : Spring Data MongoDB динамически создает прокси и внедряет его сюда. Мы используем CustomerRepository в нескольких тестах. Во-первых, он сохраняет несколько объектов Customer через метод save() . Далее, вызывается findAll() для получения всех объектов Customer из БД. Затем вызывается findByFirstName() для получения единственного Сustomer по его имени. В заключении, вызывается findByLastName() для получения всех объектов с фамилией «Smith».

Сборка исполняемого JAR

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

Затем вы можете запустить JAR-файл:

Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run , либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:

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

Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:

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

Поздравляем! Вы установили MongoDB сервер и написали простое приложение с использованием Spring Data MongoDB для сохранения объектов в БД и для их получения — и все это без написания реализации репозитория.

Топ-пост этого месяца:  Бесплатная книга «jQuery для начинающих».

Для чего идеальна MongoDb? Примеры приложений, где монга будет лучше mysql?

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

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

  • Вопрос задан более двух лет назад
  • 13564 просмотра

Исключения: в тот момент, когда понимаешь что здесь монго точно не подойдёт.

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

Для чего идеальна MongoDb? Примеры приложений, где монга будет лучше mysql?

Для человека который привык работать с реляционными БД, смириться с логикой и вообще с подобными БД — довольно сложно. Для тех, кто работает с реляционными БД профессионально — сделать это ещё сложнее.

Если сравнивать с реляционными БД и с оглядкой на конкретно MySQL — монга идеально вписывается там, где структура данных заранее неизвестна. Тут я хотел привести пример, но не смог придумать ни одного дельного примера, после того как начал плотно работать с PostgreSQL. Давайте попробую из практики. Мы один раз применяли монгу в проекте где есть десятки и сотни тысяч товарных позиций и у каждой из них свой уникальный набор различных свойств. На основе уже имеющихся свойств, «соседних» товаров, контентщику предлагался наиболее вероятный набор параметров, которые нужно заполнить, но в любой момент он мог удалить или добавить любое поле и/или множество значений одного из них, например, «Цвет: черный, серый, фиолетовый». Всё это дело попадало под разные динамические фильтры и далее по цепочке. В то время, насколько я помню ещё не было поддержки JSONB-формата у PostgreSQL, по этому мы остановились на MongoDB. Ну и конечно же, желание «воткнуть ультра новую и модную БД в проект» сыграло свою роль.

Что в монге определённо не нравится (и это не моя «идея», об этом пишут даже в учебниках под монге) — это тотальная денормализация данных. Которая в некоторых случаях может сыграть злую шутку. Например, все комментарии «поста» обычно хранятся прямо в самой сущности поста. Это очень удобно и довольно быстро работает, но. иногда это приводит к полному коллапсу. Особенно, когда у Вас перекрестная ссылочность.

Безусловно, не редко можно встретить проекты в которых даже в реляционных БД не прописаны, например, внешние ключи и контроля целостности данных как такового нет, но обычно это происходит по следующим причинам:
1. Очень низкая квалификация администратора БД проекта
2. В попытке выжать из базы больше производительности, не найдя других методов оптимизации
3. Данных настолько много, что БД/ключи — начинают «сыпаться», не редко это связано с п.1

Так же, последние тесты показывают, что PostgreSQL почти не уступает MongoDB даже в её родной среде (на уровне данных в формате JSON). А в некоторых аспектах даже превосходит её. Подробности Вы можете увидеть на некоторых конференциях по Postgres (да, на конференциях по MongoDB, Вы вряд ли увидите, как кто-то будет рассказывать, что [их любимая] монга «хуже» некоторых других движков. ). Кстати, поддержку формата JSON стандартизировали (наконец-то) на уровне SQL-стандарта (если я не ошибаюсь) и в самом ближайшем будущем, думаю стоит ожидать полноценную поддержку оного в SQL-базах, в т.ч. поддержку в бинарном виде с возможностью индексации данных (кстати, некоторые SQL-базы уже такое умеют).

Моё понимание, ответа на вопрос, «когда действительно стоит использовать MogoDB?» звучит примерно так: Исключительно в тех случаях, когда Вы понимаете, что она станет действительно хорошим решением для поставленной задачи и сейчас и в будущем. В моей практике, таких проектов можно было бы насчитать ничтожно мало, а точнее около нуля, особенно с учётом развития некоторых современных SQL-БД и вообще направления «JSON в SQL» в целом. Но, безусловно такие проекты могут быть и есть (в данном случае, не у меня). Но, тут стоит обратить внимание на крайне важный факт — когда всплывает такой проект, что бы адекватно оценить наиболее оптимальную БД под него — нужно знать как минимум пару-тройку SQL-БД, со всеми их особенностями, достоинствами и недостатками. причем не просто «знать», а хорошо знать, «изнутри». А так же знать все характерные черты монги, а так же её особенности, достоинства и т.д. То есть, если Вы задаётесь вопросом, «а хорошо ли впишется монга в проект N?» и не можете найти на него однозначного ответа, вероятнее всего, что в долгосрочной перспективе, в «проект N» она впишется плохо.

Введение в Mongoose для MongoDB и Node.js

Russian (Pусский) translation by AlexBioJS (you can also view the original English article)

Mongoose — это библиотека JavaScript, часто используемая в приложении Node.js с базой данных MongoDB. В данной статье я собираюсь познакомить вас с Mongoose и MongoDB и, что более важно, показать, где их уместно использовать в вашем приложении.

Что такое MongoDB?

Для начала рассмотрим MongoDB. MongoDB — это база данных, которая хранит ваши данные в виде документов. Как правило, эти документы имеют JSON (* JavaScript Object Notation — текстовый формат обмена данными, основанный на JavaScript. Здесь и далее примеч. пер.) — подобную структуру:

Затем документ помещается внутрь коллекции. Например, в вышеуказанном примере документа определяется объект user . Далее этот объект user стал бы, скорее всего, частью коллекции под названием users .

Одна из основных особенностей MongoDB — гибкость структуры её данных. Несмотря на то, что в первом примере объект user имел свойства firstName и lastName , эти свойства могут отсутствовать в других документах user коллекции users . Именно это отличает MongoDB от баз данных SQL (* structured query language — язык структурированных запросов), например, MySQL или Microsoft SQL Server, в которых для каждого объекта, хранящегося в базе данных, необходима фиксированная схема.

За счет способности создавать динамические объекты, которые сохраняются в виде документов в базе данных, в игру вступает Mongoose.

Что такое Mongoose?

Mongoose — это ODM (* Object Document Mapper — объектно-документный отобразитель). Это означает, что Mongoose позволяет вам определять объекты со строго-типизированной схемой, соответствующей документу MongoDB.

Mongoose предоставляет огромный набор функциональных возможностей для создания и работы со схемами. На данный момент Mongoose содержит восемь SchemaTypes (* типы данных схемы), которые может иметь свойство, сохраняемое в MongoDB. Эти типы следующие:

  1. String
  2. Number
  3. Date
  4. Buffer
  5. Boolean
  6. Mixed
  7. ObjectId (* уникальный идентификатор объекта, первичный ключ, _id)
  8. Array

Для каждого типа данных можно:

  • задать значение по умолчанию
  • задать пользовательскую функцию проверки данных
  • указать, что поле необходимо заполнить
  • задать get-функцию (геттер), которая позволяет вам проводить манипуляции с данными до их возвращения в виде объекта
  • задать set-функцию (* сеттер), которая позволяет вам проводить манипуляции с данными до их сохранения в базу данных
  • определить индексы для более быстрого получения данных

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

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

Для свойств типа Number и Date можно задать минимально и максимально допустимое значение.

Большинство из восьми допустимых типов данных должны быть вам хорошо знакомы. Однако, некоторые ( Buffer , Mixed , ObjectId и Array ) могут вызвать затруднения.

Тип данных Buffer позволяет вам сохранять двоичные данные. Типичным примером двоичных данных может послужить изображение или закодированный файл, например, документ в PDF-формате (* формат переносимого документа).

Тип данных Mixed используется для превращения свойства в «неразборчивое» поле (поле, в котором допустимы данные любого типа). Подобно тому, как многие разработчики используют MongoDB для различных целей, в этом поле можно хранить данные различного типа, поскольку отсутствует определенная структура. С осторожностью используйте этот тип данных, поскольку он ограничивает возможности, предоставляемые Mongoose, например, проверку данных и отслеживание изменений сущности для автоматического обновления свойства при сохранении.

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

Тип данных Array позволяет вам сохранять JavaScript-подобные массивы. Благодаря этому типу данных вы можете выполнять над данными типичные JavaScript операции над массивами, например, push, pop, shift, slice и т.д.

Краткое повторение

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

Mongoose — это библиотека JavaScript, позволяющая вам определять схемы со строго-типизированными данными. Сразу после определения схемы Mongoose дает вам возможность создать Model (модель), основанную на определенной схеме. Затем модель синхронизируется с документом MongoDB с помощью определения схемы модели.

Сразу после определения схем и моделей вы можете пользоваться различными функциями Mongoose для проверки, сохранения, удаления и запроса ваших данных, используя обычные функции MongoDB. Мы еще рассмотрим это более подробно на конкретных примерах.

Установка MongoDB

До того, как начать создавать схемы и модели Mongoose, нам необходимо установить и настроить MongoDB. Я бы порекомендовал вам зайти на страницу загрузки MongoDB. Имеется несколько различных вариантов установки. Я выбрал Community Server. Данный вариант позволяет вам установить версию, предназначенную именно для вашей операционной системы. Также MongoDB предлагает вариант Enterprise Server и вариант облачной установки. Поскольку целые книги можно было бы написать об установке, настройке и мониторинге MongoDB, я остановился на варианте Community Server.

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

Я подожду вас, пока вы настроите MongoDB. Как только вы справились с вышесказанным, мы можем перейти к инсталляции Mongoose для соединения с вашей только что установленной базой данных MongoDB.

Установка Mongoose

Mongoose — это библиотека JavaScript. Я собираюсь использовать её в приложении Node.js. Если у вас уже установлен Node.js, то вы можете перейти к следующему разделу. Если же не установлен, я рекомендую вам начать с посещения страницы загрузки Node.js и выбора установщика для вашей операционной системы.

Как только Node.js установлен и настроен, я собираюсь создать новое приложение и затем установить npm (* диспетчер пакетов Node) модуль Mongoose.

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

При инициализации моего приложения я оставил значения всех запрашиваемых параметров по умолчанию. Теперь я установлю модуль mongoose следующим образом:

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

В первой строке кода мы подключаем библиотеку mongoose . Далее я открываю соединение с базой данных, которую я назвал mongoose_basics , используя функцию connect .

Функция connect принимает еще два других необязательных параметра. Второй параметр — объект опций, где вы можете указать, при необходимости, например, username (имя пользователя) и password (пароль). Третий параметр, который также может быть и вторым, если у вас не определены опции, — это функция обратного вызова, которая будет вызвана после попытки соединения с базой данных. Функцию обратного вызова можно использовать двумя способами:

Чтобы избежать потенциальной необходимости введения в JavaScript Promises, я буду использовать первый способ. Ниже приводится обновленный index.js::

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

Теперь Mongoose установлена и подключена к базе данных под названием mongoose_basics . Мое соединение с MongoDB не использует ни username, ни password, ни пользовательского порта. Если вам необходимо указать эти опции или любую другую при подключении, я рекомендую вам просмотреть документацию Mongoose по подключению. В документации дается объяснение как многих доступных опций, так и процесса создания нескольких соединений, объединения соединений, реплик и т.д.

После удачного соединения давайте перейдем к определению схемы.

Определение Mongoose Schema (* схемы)

В начале статьи я показал вам объект user , который имел два свойства: firstName и lastName . В следующем примере я переделал этот документ в схему:

Это очень простая схема, которая содержит всего лишь два свойства без атрибутов, связанных с ней. Давайте распространим наш пример, сделав свойства first и last name дочерними объектами свойства name . Свойство name будет содержать свойства first и last name. Также я добавлю свойство created типа Date .

Как вы видите, Mongoose позволяет мне создавать очень гибкие схемы со множеством возможных комбинаций организации данных.

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

Выше приводится схема author , которая распространяет схему user , что я создал в предыдущем примере. Чтобы связать Author и Book, в схеме author первым свойством указываем _id типа ObjectId . _id — это стандартный синтаксис для обозначения первичного ключа в Mongoose и MongoDB. Далее, как и в схеме user , я определил свойство name , содержащее first и last name автора.

Распространяя схему user , схема author содержит несколько дополнительных свойств типа String . Также я добавил свойство типа Buffer , в котором можно было бы расположить изображение профиля автора. Последнее свойство содержит дату создания автора; однако, вы можете обратить внимание, что оно создано немного по-иному, так как в нем указано значение по умолчанию «сейчас». При сохранении автора в базу данных, данному свойству будет присвоено значение текущей даты/времени.

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

Схема book содержит несколько свойств типа String . Как было упомянуто ранее, эта схема содержит ссылку на схему author . Схема book также содержит свойство ratings типа Array , чтобы продемонстрировать вам возможности определения схем. Каждый элемент этого массива содержит свойства summary , detail , numberOfStars и created date.

Mongoose дает вам возможность создавать схемы со ссылками на другие схемы или, как в примере выше со свойством ratings , позволяет создавать Array дочерних свойств, который может содержаться в привязанной схеме (author в нашем примере) или же в текущей схеме, как в примере выше (схема book со свойством ratings типа Array ).

Создание и сохранение Mongoose Models (* моделей)

Поскольку на примере схем author и book мы увидели гибкость схемы Mongoose, я собираюсь продолжить использовать их и создать на их основе модели Author и Book .

После сохранения модели в MongoDB создается Document (* документ) с теми же свойствами, что определены в схеме, на основе которой была создана модель.

Чтобы продемонстрировать создание и сохранение объекта, в следующем примере я собираюсь создать несколько объектов: одну модель Author и несколько моделей Book . Сразу после создания эти объекты будут сохранены в MongoDB при помощи метода модели save .

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

Для создания ссылки на Author, оба объекта book ссылаются на первичный ключ _id схемы author в свойстве author схемы book .

Проверка данных перед сохранением

Общепринято наполнение данных для создания модели в форме на веб-странице. По этой причине, хорошо бы проверить эти данные перед сохранением модели в MongoDB.

В следующем примере я обновил предыдущую схему author, добавив проверку данных следующих свойств: firstName , twitter , facebook и linkedin .

Для свойства firstName был задан атрибут required . Теперь при вызове функции save , Mongoose вернет ошибку с сообщением о необходимости указания значения свойства firstName . Я решил сделать свойство lastName без необходимости указания его значения на случай, если авторами в моей базе данных были бы Cher или Madonna (* отсутствует фамилия).

Для свойств twitter , facebook и linkedin используются подобные пользовательские валидаторы. Они проверяются на соответствие начала их значений соответствующему доменному имени социальных сетей. Поскольку это необязательные для заполнения поля, валидатор применяется только в случае поступления данных для этого свойства.

Поиск и обновление данных

Введение в Mongoose не было бы завершенным без примера поиска записи и обновления одного или более свойств этого объекта.

Mongoose предоставляет несколько различных функций для поиска данных определенной модели. Эти функции следующие: find , findOne и findById .

Функции find и findOne получают в качестве аргумента объект, позволяющий осуществлять сложные запросы. Функция же findById получает только одно значение функции обратного вызова (скоро будет пример). В следующем примере я продемонстрирую вам, как можно сделать выборку книг, содержащих в своем названии строку ‘mvc’.

Внутри функции find я осуществляю поиск нечувствительной к регистру строки ‘mvc’ по свойству title . Это осуществляется с помощью того же синтаксиса, что используется для поиска строки в JavaScript.

Функцию find таккже можно «прицепить» к другим методам запроса, например, where , and , or , limit , sort , any и т.д.

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

После применения функции find порядок последующих функций не имеет значения, поскольку из всех сцепленных функций формируется единый запрос и функции не выполняются до вызова функции exec .

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

У вас значение _id может быть немного другим. Я скопировал значение _id из предыдущего console.log , когда осуществляли поиск книг, содержащих в названии строку ‘mvc’.

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

После успешного получения автора устанавливается значение свойства linkedin и вызывается функция save . Mongoose способна заметить изменение свойства linkedin и передать состояние, обновленное только по модифицированным свойствам, в MongoDB. В случае возникновения ошибки при сохранении будет выброшено исключение и приложение прекратит работу. При отсутствии ошибок в консоль будет выведено сообщение об успешном изменении.

Также Mongoose предоставляет возможность найти объект и сразу обновить его при помощи функций с соответствующими названиями: findByIdAndUpdate и findOneAndUpdate . Давайте обновим предыдущий пример, чтобы показать функцию findByIdAndUpdate в действии.

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

Полный код примера

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

Для начала я создал два дополнительных файла: author.js и book.js . Данные файлы содержат соответствующие оределения схем и создание моделей. Последняя строка кода делает модель доступной для использования в файле index.js .

Давайте начнем с файла author.js:

Далее переходим к файлу book.js :

И, наконец, обновленнй файл index.js :

В вышеуказанном примере все действия Mongoose содержатся внутри функции connect . Файлы author и book подключаются при помощи функции require после подключения mongoose .

Если MongoDB запущена, вы теперь можете запустить полное приложение Node.js при помощи следующей команды:

После сохранения некоторых данных в базу я обновил файл index.js , добавив функции поиска, следующим образом:

Опять-таки, вы можете запустить приложение при помощи следующей команды: node index.js .

Резюме

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

Надеюсь, теперь вы чувствуете себя уверенным пользователем Mongoose. Если вы хотите узнать больше о Mongoose, я бы рекомендовал вам изучить Mongoose Guides, в котором объясняются более продвинутые темы, например, population, middleware, promises и т.д.

Добавить комментарий