Статьи

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

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

Начнем с MongoDB. MongoDB — это база данных, в которой ваши данные хранятся в виде документов. Чаще всего эти документы напоминают JSON-подобную структуру:

1
2
3
4
{
  firstName: «Jamie»,
  lastName: «Munro»
}

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

Одним из ключевых факторов с MongoDB является его гибкость, когда речь идет о структуре. Несмотря на то, что в первом примере user объект содержал свойства firstName и lastName , эти свойства не требуются в каждом user документе, который является частью коллекции users . Это то, что отличает MongoDB от базы данных SQL, такой как MySQL или Microsoft SQL Server, которая требует строго определенной схемы базы данных каждого объекта, который она хранит.

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

Mongoose является картографом объектных документов (ODM). Это означает, что Mongoose позволяет вам определять объекты со строго типизированной схемой, которая сопоставлена ​​с документом MongoDB.

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

  1. строка
  2. номер
  3. Дата
  4. буфер
  5. логический
  6. смешанный
  7. ObjectId
  8. массив

Каждый тип данных позволяет вам указать:

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

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

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

Свойства Number и Date поддерживают указание минимального и максимального значения, допустимого для этого поля.

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

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

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

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

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

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

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

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

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

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

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

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

С настроенным и готовым к работе Node.js я собираюсь создать новое приложение, а затем установить пакет Mongoose NPM.

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

1
2
3
mkdir mongoose_basics
cd mongoose_basics
npm init

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

1
npm install mongoose —save

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

1
2
3
var mongoose = require(‘mongoose’);
 
mongoose.connect(‘mongodb://localhost/mongoose_basics’);

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
mongoose.connect(uri, options, function(error) {
 
// Check error in initial connection.
 
});
 
// Or using promises
 
mongoose.connect(uri, options).then(
 
() => { /** ready to use.
 
err => { /** handle initial connection error */ }
 
);

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

1
2
3
4
5
6
7
8
9
var mongoose = require(‘mongoose’);
 
mongoose.connect(‘mongodb://localhost/mongoose_basics’, function (err) {
 
   if (err) throw err;
 
   console.log(‘Successfully connected’);
 
});

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

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

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

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

1
2
3
4
var userSchema = mongoose.Schema({
    firstName: String,
    lastName: String
});

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

1
2
3
4
5
6
7
var userSchema = mongoose.Schema({
    name: {
        firstName: String,
    lastName: String
    },
    created: Date
});

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
var authorSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: {
            firstName: String,
        lastName: String
    },
    biography: String,
    twitter: String,
    facebook: String,
    linkedin: String,
    profilePicture: Buffer,
    created: {
        type: Date,
        default: Date.now
    }
});

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

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

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

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
var bookSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    title: String,
    summary: String,
    isbn: String,
    thumbnail: Buffer,
    author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: ‘Author’
    },
    ratings: [
        {
            summary: String,
            detail: String,
            numberOfStars: Number,
            created: {
                type: Date,
                default: Date.now
            }
        }
    ],
    created: {
        type: Date,
        default: Date.now
    }
});

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

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

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

1
2
3
var Author = mongoose.model(‘Author’, authorSchema);
 
var Book = mongoose.model(‘Book’, bookSchema);

Модель Mongoose при сохранении создает документ в MongoDB со свойствами, определенными схемой, из которой она получена.

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

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
var jamieAuthor = new Author {
    _id: new mongoose.Types.ObjectId(),
    name: {
        firstName: ‘Jamie’,
        lastName: ‘Munro’
    },
    biography: ‘Jamie is the author of ASP.NET MVC 5 with Bootstrap and Knockout.js.’,
    twitter: ‘https://twitter.com/endyourif’,
    facebook: ‘https://www.facebook.com/End-Your-If-194251957252562/’
};
 
jamieAuthor.save(function(err) {
    if (err) throw err;
     
    console.log(‘Author successfully saved.’);
     
    var mvcBook = new Book {
            _id: new mongoose.Types.ObjectId(),
            title: ‘ASP.NET MVC 5 with Bootstrap and Knockout.js’,
            author: jamieAuthor._id,
            ratings:[{
                summary: ‘Great read’
            }]
    };
     
    mvcBook.save(function(err) {
        if (err) throw err;
     
        console.log(‘Book successfully saved.’);
    });
     
    var knockoutBook = new Book {
            _id: new mongoose.Types.ObjectId(),
            title: ‘Knockout.js: Building Dynamic Client-Side Web Applications’,
            author: jamieAuthor._id
    };
     
    knockoutBook.save(function(err) {
        if (err) throw err;
     
        console.log(‘Book successfully saved.’);
    });
});

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

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

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

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

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
var authorSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: {
        firstName: {
            type: String,
            required: true
        },
        lastName: String
    },
    biography: String,
    twitter: {
        type: String,
        validate: {
            validator: function(text) {
                return text.indexOf(‘https://twitter.com/’) === 0;
            },
            message: ‘Twitter handle must start with https://twitter.com/’
        }
    },
    facebook: {
        type: String,
        validate: {
            validator: function(text) {
                return text.indexOf(‘https://www.facebook.com/’) === 0;
            },
            message: ‘Facebook must start with https://www.facebook.com/’
        }
    },
    linkedin: {
        type: String,
        validate: {
            validator: function(text) {
                return text.indexOf(‘https://www.linkedin.com/’) === 0;
            },
            message: ‘LinkedIn must start with https://www.linkedin.com/’
        }
    },
    profilePicture: Buffer,
    created: {
        type: Date,
        default: Date.now
    }
});

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

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

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

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

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

1
2
3
4
5
6
7
Book.find({
    title: /mvc/i
}).exec(function(err, books) {
    if (err) throw err;
     
    console.log(books);
});

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

Вызов функции find также может быть связан с другими методами запроса, такими как where and , or , limit , sort , any и т. Д.

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

1
2
3
4
5
6
7
8
9
Book.find({
    title: /mvc/i
}).sort(‘-created’)
.limit(5)
.exec(function(err, books) {
    if (err) throw err;
     
    console.log(books);
});

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

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

1
2
3
4
5
Author.findById(’59b31406beefa1082819e72f’, function(err, author) {
    if (err) throw err;
     
    console.log(author);
});

_id в вашем случае может немного отличаться. Я скопировал этот _id из предыдущего console.log когда нашел список книг с заголовком «mvc».

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

01
02
03
04
05
06
07
08
09
10
11
Author.findById(’59b31406beefa1082819e72f’, function(err, author) {
    if (err) throw err;
     
    author.linkedin = ‘https://www.linkedin.com/in/jamie-munro-8064ba1a/’;
     
    author.save(function(err) {
        if (err) throw err;
         
        console.log(‘Author updated successfully’);
    });
});

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

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

1
2
3
4
5
6
7
Author.findByIdAndUpdate(’59b31406beefa1082819e72f’,
    { linkedin: ‘https://www.linkedin.com/in/jamie-munro-8064ba1a/’ },
    function(err, author) {
        if (err) throw err;
     
        console.log(author);
});

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

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

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

Начнем с файла author.js:

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
var mongoose = require(‘mongoose’);
 
var authorSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: {
        firstName: {
            type: String,
            required: true
        },
        lastName: String
    },
    biography: String,
    twitter: {
        type: String,
        validate: {
            validator: function(text) {
                return text.indexOf(‘https://twitter.com/’) === 0;
            },
            message: ‘Twitter handle must start with https://twitter.com/’
        }
    },
    facebook: {
        type: String,
        validate: {
            validator: function(text) {
                return text.indexOf(‘https://www.facebook.com/’) === 0;
            },
            message: ‘Facebook must start with https://www.facebook.com/’
        }
    },
    linkedin: {
        type: String,
        validate: {
            validator: function(text) {
                return text.indexOf(‘https://www.linkedin.com/’) === 0;
            },
            message: ‘LinkedIn must start with https://www.linkedin.com/’
        }
    },
    profilePicture: Buffer,
    created: {
        type: Date,
        default: Date.now
    }
});
 
var Author = mongoose.model(‘Author’, authorSchema);
 
module.exports = Author;

Далее идет файл book.js :

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
var mongoose = require(‘mongoose’);
 
var bookSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    title: String,
    summary: String,
    isbn: String,
    thumbnail: Buffer,
    author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: ‘Author’
    },
    ratings: [
        {
            summary: String,
            detail: String,
            numberOfStars: Number,
            created: {
                type: Date,
                default: Date.now
            }
        }
    ],
    created: {
        type: Date,
        default: Date.now
    }
});
 
var Book = mongoose.model(‘Book’, bookSchema);
 
module.exports = Book;

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

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
var mongoose = require(‘mongoose’);
 
var Author = require(‘./author’);
var Book = require(‘./book’);
 
mongoose.connect(‘mongodb://localhost/mongoose_basics’, function (err) {
    if (err) throw err;
     
    console.log(‘Successfully connected’);
     
    var jamieAuthor = new Author({
        _id: new mongoose.Types.ObjectId(),
        name: {
            firstName: ‘Jamie’,
            lastName: ‘Munro’
        },
        biography: ‘Jamie is the author of ASP.NET MVC 5 with Bootstrap and Knockout.js.’,
        twitter: ‘https://twitter.com/endyourif’,
        facebook: ‘https://www.facebook.com/End-Your-If-194251957252562/’
    });
 
    jamieAuthor.save(function(err) {
        if (err) throw err;
         
        console.log(‘Author successfully saved.’);
         
        var mvcBook = new Book({
            _id: new mongoose.Types.ObjectId(),
            title: ‘ASP.NET MVC 5 with Bootstrap and Knockout.js’,
            author: jamieAuthor._id,
            ratings:[{
                summary: ‘Great read’
            }]
        });
         
        mvcBook.save(function(err) {
            if (err) throw err;
         
            console.log(‘Book successfully saved.’);
        });
         
        var knockoutBook = new Book({
            _id: new mongoose.Types.ObjectId(),
            title: ‘Knockout.js: Building Dynamic Client-Side Web Applications’,
            author: jamieAuthor._id
        });
         
        knockoutBook.save(function(err) {
            if (err) throw err;
         
            console.log(‘Book successfully saved.’);
        });
    });
});

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

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

1
node index.js

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

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
var mongoose = require(‘mongoose’);
 
var Author = require(‘./author’);
var Book = require(‘./book’);
 
mongoose.connect(‘mongodb://localhost/mongoose_basics’, function (err) {
    if (err) throw err;
     
    console.log(‘Successfully connected’);
     
    Book.find({
        title: /mvc/i
    }).sort(‘-created’)
    .limit(5)
    .exec(function(err, books) {
        if (err) throw err;
         
        console.log(books);
    });
     
    Author.findById(’59b31406beefa1082819e72f’, function(err, author) {
        if (err) throw err;
         
        author.linkedin = ‘https://www.linkedin.com/in/jamie-munro-8064ba1a/’;
         
        author.save(function(err) {
            if (err) throw err;
             
            console.log(‘Author updated successfully’);
        });
    });
     
    Author.findByIdAndUpdate(’59b31406beefa1082819e72f’, { linkedin: ‘https://www.linkedin.com/in/jamie-munro-8064ba1a/’ }, function(err, author) {
        if (err) throw err;
         
        console.log(author);
    });
});

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

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

Надеюсь, теперь вы чувствуете себя комфортно, используя Mongoose. Если вы хотите узнать больше, я бы посоветовал ознакомиться с руководствами Mongoose, в которых рассматриваются более сложные темы, такие как популяция, промежуточное ПО, обещания и т. Д.

Удачной охоты (ссылка на бедного мангустского животного)!