<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MongoDB &#8902; Clip-Clap</title>
	<atom:link href="https://clip-clap.ru/tag/mongodb/feed/" rel="self" type="application/rss+xml" />
	<link>https://clip-clap.ru/tag/mongodb/</link>
	<description></description>
	<lastBuildDate>Sun, 04 Oct 2020 18:33:11 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.8</generator>

<image>
	<url>https://clip-clap.ru/wp-content/uploads/2020/07/cropped-favicon-32x32.png</url>
	<title>MongoDB &#8902; Clip-Clap</title>
	<link>https://clip-clap.ru/tag/mongodb/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Подробное руководство по MongoDB, Mongoose</title>
		<link>https://clip-clap.ru/it/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d0%bf%d0%be-mongodb-mongoose/</link>
					<comments>https://clip-clap.ru/it/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d0%bf%d0%be-mongodb-mongoose/#respond</comments>
		
		<dc:creator><![CDATA[Admin]]></dc:creator>
		<pubDate>Sun, 04 Oct 2020 18:32:54 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Софт и ОС]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Mongoose]]></category>
		<guid isPermaLink="false">https://clip-clap.ru/?p=2280</guid>

					<description><![CDATA[<p>Обновление статьи Введение MongoDB состоит из БД, которые состоят из коллекций. Коллекции, в свою очередь, состоят из документов. Каждый документ состоит из полей.www.mongodb.com</p>
<p>Сообщение <a href="https://clip-clap.ru/it/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d0%bf%d0%be-mongodb-mongoose/">Подробное руководство по MongoDB, Mongoose</a> появились сначала на <a href="https://clip-clap.ru">Clip-Clap</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://clip-clap.ru/it/%d1%81%d0%be%d1%84%d1%82-%d0%b8-%d0%be%d1%81/mongodb-%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be/" target="_blank" rel="noreferrer noopener">Обновление статьи</a> </p>



<h2 class="wp-block-heading" id="target-0">Введение</h2>



<p>MongoDB состоит из БД, которые состоят из <strong>коллекций</strong>. Коллекции, в свою очередь, состоят из <strong>документов</strong>. Каждый документ состоит из <strong>полей</strong>.<br><a href="https://www.mongodb.com/" target="_blank" rel="noreferrer noopener nofollow">www.mongodb.com</a></p>



<h2 class="wp-block-heading" id="target-1">MongoDB клиенты</h2>



<ul><li><a href="https://robomongo.org/" target="_blank" rel="noreferrer noopener nofollow">https://robomongo.org/</a></li><li><a href="https://studio3t.com/" target="_blank" rel="noreferrer noopener nofollow">https://studio3t.com/</a> (+)</li></ul>


</br>



<h2 class="wp-block-heading" id="target-2">Конфиг mongodb для windows</h2>



<p>В папке&nbsp;<code>bin</code>&nbsp;создайте файл и назовите его&nbsp;<code>mongodb.config</code>.</p>



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



<pre class="wp-block-preformatted">dbpath=c:\mongodb\data</pre>



<h2 class="wp-block-heading" id="target-3">Запуск</h2>



<ul><li><code>mongod</code>&nbsp;&#8212; это&nbsp;<strong>сервер</strong>&nbsp;баз данных MongoDB. Он обрабатывает запросы, управляет форматом данных и выполняет различные операции в фоновом режиме по управлению БД. Командная строка отобразит нам ряд служебной информации, например, что сервер запускается на&nbsp;<code>localhost</code>&nbsp;на порту&nbsp;<code>27017</code>.</li><li><code>mongo</code>&nbsp;&#8212; клиентская&nbsp;<strong>консоль</strong>&nbsp;для взаимодействия с базами данных.</li><li><code>mongodump</code>&nbsp;&#8212; утилита создания бэкапа БД.</li><li><code>mongorestore</code>&nbsp;&#8212; позволяет записывать данные из дампа, созданного&nbsp;<code>mongodump</code>, в новую или существующую БД.</li></ul>



<h3 class="wp-block-heading" id="target-4">Стартуем mongod (сервер):</h3>



<pre class="wp-block-preformatted">mongod --config c:\mongodb\bin\mongodb.config
// не забудьте заранее создать папку data</pre>



<h3 class="wp-block-heading" id="target-5">Подключаемся к запущенному серверу</h3>



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



<pre class="wp-block-preformatted">mongo</pre>



<h2 class="wp-block-heading" id="target-6">Работаем с БД</h2>



<h3 class="wp-block-heading" id="target-7">Выводим все БД в mongo:</h3>



<pre class="wp-block-preformatted">show dbs</pre>



<h3 class="wp-block-heading" id="target-8">Переходим (и одновременно создаем) к нужной БД</h3>



<pre class="wp-block-preformatted">use name_bd</pre>



<p>Команды&nbsp;<code>db</code>&nbsp;возвращает имя БД, внутри которой мы сейчас находимся:</p>



<pre class="wp-block-preformatted">db
//test</pre>


</br>



<h2 class="wp-block-heading" id="target-9">Коллекции</h2>



<h3 class="wp-block-heading" id="target-10">Показать все коллекции в БД</h3>



<pre class="wp-block-preformatted">show collections</pre>



<h3 class="wp-block-heading" id="target-11">Метод find()</h3>



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



<pre class="wp-block-preformatted">db.collection_name.find()</pre>



<p>Пример:</p>



<pre class="wp-block-preformatted">db.band.find()</pre>



<pre class="wp-block-preformatted">db.band.find().pretty()</pre>



<p>Метод&nbsp;<code>pretty</code>&nbsp;выводит результат в удобном для чтения виде.</p>



<h3 class="wp-block-heading" id="target-12">Метод count()</h3>



<p>Метод&nbsp;<code>count</code>&nbsp;выводит количество документов в коллекции:</p>



<pre class="wp-block-preformatted">db.band.count()</pre>



<h3 class="wp-block-heading" id="target-13">Метод remove()</h3>



<p>Метод&nbsp;<code>remove</code>&nbsp;используется, чтобы удалить документ из коллекции (или всю коллекцию).</p>



<pre class="wp-block-preformatted">db.unicorns.remove({name: "Leto"})</pre>



<h3 class="wp-block-heading" id="target-14">Метод insert()</h3>



<p>Заносим данные в коллекцию&nbsp;<code>band</code>&nbsp;(создаем тем самым коллекцию&nbsp;<code>band</code>, если ее нет):</p>



<pre class="wp-block-preformatted">db.band.insert({name: 'Queen', bid: '3'})</pre>



<p>Добавим составы груп в коллекцию&nbsp;<code>band</code>:</p>



<pre class="wp-block-preformatted">db.band.update({bid: '1'}, {$set: {members: [
    {name: "Jimmy Page", id: "1"},
    {name: "robert Plant", id: "2"},
    {name: "John Bonham", id: "3"},
    {name: "John Paul Jones", id: "4"}]}})

db.band.update({bid: '2'}, {$set: {members: [
    {name: "Syd Barret", id: "5"},
    {name: "Roger Waters", id: "6"},
    {name: "Nick Mason", id: "7"},
    {name: "Richard Wright", id: "8"},
    {name: "David Gilmour", id: "9"}]}})</pre>


</br>



<p>Мы можем добавлять данные, не декларируя их предварительно: свойство&nbsp;<code>members</code>. Отсутствует схема: легко добавили массив объектов.</p>



<p>Мы не обязаны создавать коллекции явно. Мы просто можем&nbsp;<strong>вставить документ в новую коллекцию</strong>. Чтобы это сделать, используйте команду&nbsp;<code>insert</code>, передав ей вставляемый документ:</p>



<pre class="wp-block-preformatted">db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})</pre>



<h2 class="wp-block-heading" id="target-15">Модификация данных</h2>



<h3 class="wp-block-heading" id="target-16">Оператор $set</h3>



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



<h3 class="wp-block-heading" id="target-17">Оператор $unset</h3>



<p>Оператор&nbsp;<code>$unset</code>&nbsp;удаляет указанный ключ</p>



<pre class="wp-block-preformatted">db.collection.update({id: 2}, {$unset: {myKey: 1}});
db.example.update({}, {$unset: {words:1}}, false, true);</pre>



<h3 class="wp-block-heading" id="target-18">Оператор $inc</h3>



<p>Оператор&nbsp;<code>$inc</code>&nbsp;увеличивает значение поля на указанную величину</p>



<pre class="wp-block-preformatted">db.collection.update({id: 2}, {$inc: {myCounter: 111}});
db.collection.update( {"players.playerName":"Joe"}, { $inc : { "players.$.playerScore" : 1 } }</pre>



<h3 class="wp-block-heading" id="target-19">Оператор $rename</h3>



<p>Оператор&nbsp;<code>$rename</code>&nbsp;позволяет переименовать поля</p>



<pre class="wp-block-preformatted">db.collection.update({id: 2}, {$rename: {"old_name": "new_name"}});
db.band.update({bid: "1"},{$rename:{"members":"members_new"}});</pre>



<h2 class="wp-block-heading" id="target-20">Индексы</h2>



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



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



<p>Построим индекс по ключу&nbsp;<code>bid</code>:</p>



<pre class="wp-block-preformatted">db.band.ensureIndex({bid: 1}) // deprecated
 db.users.createIndex({"name" : 1}) // actual</pre>



<p><code>ensureIndex</code>&nbsp;устарел, начиная с версии 3.0, в данный момент является псевдонимом для&nbsp;<code>db.collection.createIndex()</code>.</p>



<p>Полезные материалы: на <a href="http://metanit.com/nosql/mongodb/2.12.php" target="_blank" rel="noreferrer noopener nofollow">metanit.com/nosql/mongodb</a> &#8212; Работа с индексами,<br><a href="https://proselyte.net/tutorials/mongodb/indexing/" target="_blank" rel="noreferrer noopener nofollow">proselyte.net/tutorials/mongodb/indexing</a> &#8212; Индексация в MongoDB</p>


</br>



<h2 class="wp-block-heading" id="target-21">Схемы и модели</h2>



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



<h2 class="wp-block-heading" id="target-22">Основы MongoDB</h2>



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



<h3 class="wp-block-heading" id="target-23">Отличия MongoDB от реляционных БД</h3>



<p>Основное различие в том, что реляционные базы данных определяют «колонки» на уровне «таблицы», в то время как документ-ориентированные базы данных определяют «поля» (в реляционных &#171;колонки&#187;) на уровне «документа» (в релационных &#171;запись&#187;).</p>



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



<h2 class="wp-block-heading" id="target-24">Селекторы запросов</h2>



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



<p><strong>Селектор</strong>&nbsp;— это JSON-объект, в простейшем случае это может быть даже&nbsp;<code>{}</code>, что означает выборку всех документов (аналогичным образом работает&nbsp;<code>null</code>). Если нам нужно выбрать всех единорогов (англ. «unicorns») женского рода, можно воспользоваться селектором&nbsp;<code>{gender:'f'}</code>.</p>



<p><code>{поле: значение}</code>&nbsp;используется для поиска всех документов, у которых есть &#8216;поле&#8217; и у него есть &#8216;значение&#8217;.</p>



<p><code>{поле1: значение1, поле2: значение2}</code>&nbsp;работает как логическое&nbsp;<code>И</code>.</p>



<h3 class="wp-block-heading" id="target-25">Оператор $lt, $lte, $gt, $gte, $ne</h3>



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



<p>Пример использовани селекторов с командой&nbsp;<code>find</code>&nbsp;(но также селекторы могут быть использованы с&nbsp;<code>remove</code>,&nbsp;<code>count</code>,&nbsp;<code>update</code>):</p>



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



<pre class="wp-block-preformatted">db.unicorns.find({gender: 'm', weight: {$gt: 700}})</pre>



<h3 class="wp-block-heading" id="target-26">Оператор $exists</h3>



<p>Оператор&nbsp;<code>$exists</code>&nbsp;используется для проверки наличия или отсутствия поля, например:</p>



<pre class="wp-block-preformatted">db.unicorns.find({vampires: {$exists: false}})</pre>



<h3 class="wp-block-heading" id="target-27">Оператор $or</h3>



<p>Оператор&nbsp;<code>$or</code>&nbsp;используется как ИЛИ</p>



<pre class="wp-block-preformatted">db.unicorns.find({gender: 'f', $or: [{loves: 'apple'}, {loves: 'orange'}, {weight: {$lt: 500}}]})
//... или любят яблоки, или любят апельсины, или весят менее 500 фунтов</pre>



<p>Отметьте</p>



<pre class="wp-block-preformatted">db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'],
    weight: 601, gender: 'f', vampires: 33});</pre>



<p>Поле&nbsp;<code>loves</code>&nbsp;это массив. MongoDB поддерживает массивы как объекты первого класса. Самое интересное это та простота, с которой делается выборка по значению массива:&nbsp;<code>{loves: 'watermelon'}</code>&nbsp;вернёт нам все документы, у которых&nbsp;<code>watermelon</code>&nbsp;является одним из значений поля&nbsp;<code>loves</code>.</p>


</br>



<h3 class="wp-block-heading" id="target-28">Оператор $where</h3>



<p>Оператор&nbsp;<code>$where</code>&nbsp;(в след. разделах)</p>



<p>Самый гибкий оператор —&nbsp;<code>$where</code>, позволяющий нам передавать JavaScript для его выполнения на сервере.</p>



<h3 class="wp-block-heading" id="target-29">Оператор ObjectId</h3>



<p><code>ObjectId</code>, сгенерированный MongoDB для поля&nbsp;<code>_id</code>, подставляется в селектор следующим образом:</p>



<pre class="wp-block-preformatted">db.unicorns.find({_id: ObjectId("TheObjectId")})</pre>



<h2 class="wp-block-heading" id="target-30">update</h2>



<p>В простейшей форме,&nbsp;<code>update</code>&nbsp;принимает 2 аргумента: селектор для выборки и то, чем обновить соответствующее поле.&nbsp;<strong>Второй параметр используется для полной замены оригинала</strong>:</p>



<pre class="wp-block-preformatted">db.unicorns.update({name: 'Roooooodles'}, {weight: 590})</pre>



<p>По умолчанию,&nbsp;<code>update</code>&nbsp;обновляет лишь первый найденный документ</p>



<h3 class="wp-block-heading" id="target-31">Модификатор $set</h3>



<p>Модификатор&nbsp;<code>$set</code>&nbsp;обновляет конкретные поля, а не весь документ.</p>



<p>Если вам нужно всего лишь изменить пару полей, лучше всего использовать модификатор&nbsp;<code>$set</code>:</p>



<pre class="wp-block-preformatted">db.unicorns.update({weight: 590},
    {$set: {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], gender: 'm', vampires: 99}})

db.unicorns.update({name: 'Roooooodles'}, {$set: {weight: 590}})</pre>



<p>Не забывайте использовать модификатор&nbsp;<code>$set</code>, если вам нужно обновить лишь некоторые поля.</p>



<h3 class="wp-block-heading" id="target-32">модификатор $inc</h3>



<p>Модификатор&nbsp;<code>$inc</code>&nbsp;&#8212; увеличить или уменьшить значение поля. Модификатор воздействуют непосредственно на поля, а не на весь документ.</p>



<pre class="wp-block-preformatted">db.unicorns.update({name: 'Pilot'}, {$inc: {vampires: -2}})</pre>


</br>



<h3 class="wp-block-heading" id="target-33">Модификатор $push</h3>



<p>Модификатор&nbsp;<code>$push</code>&nbsp;&#8212; позволяет добавить данные в массив. Модификатор воздействуют непосредственно на поля, а не на весь документ.</p>



<pre class="wp-block-preformatted">db.unicorns.update({name: 'Aurora'}, {$push: {loves: 'sugar'}})</pre>



<h3 class="wp-block-heading" id="target-34">Разрешаем вставку при обновлении (3-й параметр)</h3>



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



<pre class="wp-block-preformatted">db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}});
db.hits.find();</pre>



<p>Вставки и обновления не будет, так как 3-й параметр опущен, а документа с&nbsp;<code>{page: 'unicorns'}</code>&nbsp;отсутствует в коллекции.</p>



<pre class="wp-block-preformatted">db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}}, true);
db.hits.find();</pre>



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



<p>Одновременно создастся коллекция&nbsp;<code>hits</code>, если она отсутствует.</p>



<h3 class="wp-block-heading" id="target-35">Множественные обновления (4-й параметр)</h3>



<p>Чтобы обновить множество документов нужно установить&nbsp;<strong>четвертый параметр</strong>&nbsp;в&nbsp;<code>true</code>:</p>



<pre class="wp-block-preformatted">db.unicorns.update({}, {$set: {vaccinated: true }}, false, true);</pre>



<p>Этим мы обновили все поля добавив везде поле&nbsp;<code>vaccinated</code>&nbsp;со значением&nbsp;<code>true</code></p>



<h2 class="wp-block-heading" id="target-36">find (курсор)</h2>



<p><strong>Курсор базы данных</strong>&nbsp;&#8212; это объект БД, который позволяет приложениям работать с записями &#171;по-одной&#187;, а не с множеством сразу. То есть курсор (как мы помним это объект), который позволяет передвигаться по выборке (назад на одно, вперед на одну, в конец/начало) при помощи своих методов.</p>



<p>Как уже упоминалось, результатом&nbsp;<code>find</code>&nbsp;является курсор.&nbsp;<strong>Второй необязательный параметр</strong>&nbsp;у&nbsp;<code>find</code>&nbsp;это список полей, которые мы хотим получить.</p>



<pre class="wp-block-preformatted">db.unicorns.find(null, {name: 1});
cursor = db.unicorns.find(null, {name: 1});</pre>



<p><code>_id</code>&nbsp;по умолчанию возвращается всегда. Но мы можем исключить<code>&nbsp;_id</code>&nbsp;следующим образом:&nbsp;<code>{name:1, _id: 0}</code>.</p>



<p>Получаем все поля, кроме поля&nbsp;<code>name</code>:</p>



<pre class="wp-block-preformatted">db.unicorns.find({}, {name: 0})</pre>



<p>Как уже упоминалось, результатом&nbsp;<code>find</code>&nbsp;является&nbsp;<strong>курсор</strong>. Поэтому мы&nbsp;<strong>можем присоединить к нему ряд методов</strong>:</p>



<h3 class="wp-block-heading" id="target-37">Сортировка (метод sort)</h3>



<p>Синтаксис метода&nbsp;<code>sort:</code>&nbsp;мы указываем поля, по которым надо сортировать, используя&nbsp;<code>1</code>&nbsp;для сортировки по возрастанию и&nbsp;<code>-1</code>&nbsp;для сортировки по убыванию. Например:</p>



<pre class="wp-block-preformatted">db.unicorns.find().sort({weight: -1})
// по убыванию 999,998,997 ...</pre>



<pre class="wp-block-preformatted">db.unicorns.find({}, {name: true}).sort({name: -1})</pre>



<p>Но для сортировки большого объема данных в MongoDB необходимо использовать&nbsp;<strong>индексы</strong>.</p>


</br>



<h3 class="wp-block-heading" id="target-38">Метод limit()</h3>



<pre class="wp-block-preformatted">db.unicorns.find({}, {name: true}).sort({name: -1}).limit(3)</pre>



<h3 class="wp-block-heading" id="target-39">Метод skip()</h3>



<p>Метод&nbsp;<code>skip()</code>&nbsp;позволяет пропустить определенное количество записей.</p>



<pre class="wp-block-preformatted">db.unicorns.find({}, {name: true}).sort({name: -1}).limit(3).skip(1)</pre>



<p>Обратите внимание как мы соединяем методы в&nbsp;<strong>цепочки</strong>.</p>



<h2 class="wp-block-heading" id="target-40">Моделирование данных</h2>



<p>MongoDB не поддерживает&nbsp;<code>JOIN</code>. По существу мы должны делать второй запрос, чтобы найти связанные данные.</p>



<p>p.s: Для создания нового&nbsp;<code>ObjectID</code>&nbsp;используется следующий код:&nbsp;<code>NewObjectId = ObjectId()</code></p>



<h3 class="wp-block-heading" id="target-41">Моделируем &#8216;один-ко-многим&#8217; или &#8216;многие-ко-многим&#8217;</h3>



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



<pre class="wp-block-preformatted">db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d733"), name: 'Siona',
manager: [ObjectId("4d85c7039ab0fd70a117d730"), ObjectId("4d85c7039ab0fd70a117d732")] })</pre>



<p>При этом следующий&nbsp;<code>find</code>&nbsp;сработает:</p>



<pre class="wp-block-preformatted">db.employees.find({manager: ObjectId("4d85c7039ab0fd70a117d730")})</pre>



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



<h2 class="wp-block-heading" id="target-42">Вложенные документы</h2>



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



<pre class="wp-block-preformatted">db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d734"),
name: 'Ghanima', family: {mother: 'Chani', father: 'Paul', brother: ObjectId("4d85c7039ab0fd70a117d730")}})</pre>



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



<pre class="wp-block-preformatted">db.employees.find({'family.mother': 'Chani'})</pre>


</br>



<h2 class="wp-block-heading" id="target-43">Денормализация</h2>



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



<h2 class="wp-block-heading" id="target-44">Команды (выжимка)</h2>



<pre class="wp-block-preformatted">db.version()
//показывает номер версии сервера</pre>



<pre class="wp-block-preformatted">db.getCollectionNames()
//получить список коллекций внутри нашей БД</pre>



<pre class="wp-block-preformatted">db.unicorns.find()
//вернет список документов (записей)</pre>



<pre class="wp-block-preformatted">db.unicorns.remove()
//поскольку мы не передали селектора, произойдёт удаление всех документов</pre>



<pre class="wp-block-preformatted">//Например, чтобы получить всех самцов единорога, весящих более 700 фунтов, мы можем написать:
db.unicorns.find({gender: 'm', weight: {$gt: 700}})</pre>



<pre class="wp-block-preformatted">//Оператор $exists используется для проверки наличия или отсутствия поля, например:
db.unicorns.find({vampires: {$exists: false}})</pre>



<pre class="wp-block-preformatted">//Оператор $or используется как ИЛИ
db.unicorns.find({gender: 'f', $or: [{loves: 'apple'}, {loves: 'orange'}, {weight: {$lt: 500}}]})</pre>



<pre class="wp-block-preformatted">//update принимает 2 аргумента: селектор (where) для выборки и то, чем обновить соответствующее поле.
//Второй параметр используется для полной замены оригинала
db.unicorns.update({name: 'Roooooodles'}, {weight: 590})</pre>



<pre class="wp-block-preformatted">//Модификатор $set обновляет конкретные поля, а не весь документ
db.unicorns.update({name: 'Roooooodles'}, {$set: {weight: 590}})</pre>



<pre class="wp-block-preformatted">//модификатор $inc - увеличить или уменьшить значение поля
db.unicorns.update({name: 'Pilot'}, {$inc: {vampires: -2}})</pre>



<pre class="wp-block-preformatted">//модификатор $push - позволяет добавить данные в массив
db.unicorns.update({name: 'Aurora'}, {$push: {loves: 'sugar'}})</pre>



<pre class="wp-block-preformatted">//Обновление/вставка обновляет документ, если он найден, или создаёт новый — если не найден.
//Чтобы разрешить вставку при обновлении, установите третий параметр в true (ниже мы создаем коллекцию hits, если ее нет)
db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}}, true);</pre>



<pre class="wp-block-preformatted">//если установить 4-й параметр в true, то обновятся все документы
db.unicorns.update({}, {$set: {vaccinated: true }}, false, true);</pre>



<pre class="wp-block-preformatted">//Второй необязательный параметр у find указывает на список полей, которые мы хотим получить.
db.unicorns.find(null, { name:true })</pre>


</br>



<pre class="wp-block-preformatted">//получаем все поля, кроме поля name:
db.unicorns.find({}, {name: 0})</pre>



<pre class="wp-block-preformatted">//сортировка по убыванию
db.unicorns.find().sort({weight: -1})</pre>



<pre class="wp-block-preformatted">// сортируем по весу, но получаем 2 и 3 по весу единорога, пропуская 1-го
db.unicorns.find().sort({weight: -1}).limit(2).skip(1)</pre>



<pre class="wp-block-preformatted">//подсчитать кол-во единорогов на счету которых более 60 вампиров
db.unicorns.count({vampires: {$gt: 50}})</pre>



<pre class="wp-block-preformatted">//Когда требуется смоделировать отношения «один-ко-многим» или «многие-ко-многим» можно использовать массивы
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d733"), name: 'Siona',
manager: [ObjectId("4d85c7039ab0fd70a117d730"), ObjectId("4d85c7039ab0fd70a117d732")] })</pre>



<pre class="wp-block-preformatted">// Ищем значение в массиве manager
db.employees.find({manager: ObjectId("4d85c7039ab0fd70a117d730")})</pre>



<pre class="wp-block-preformatted">//MongoDB поддерживает вложенные документы:
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d734"), name: 'Ghanima',
family: {mother: 'Chani', father: 'Paul', brother: ObjectId("4d85c7039ab0fd70a117d730")}})</pre>



<pre class="wp-block-preformatted">//Вложенные документы можно запрашивать с помощью точечной нотации:
db.employees.find({'family.mother': 'Chani'})</pre>



<pre class="wp-block-preformatted">// версия &gt; 3.2
db.employees.updateOne(…);
db.employees.updateMany (…);</pre>



<p><a href="https://docs.mongodb.com/manual/reference/operator/update/" target="_blank" rel="noreferrer noopener nofollow">operator update</a> (документация)</p>



<pre class="wp-block-preformatted">// другие команды для работы с коллекциями:

insertOne
insertMany

    // получаем кол-во документов в коллекции
db.cats.count()

// модификаторы:
    // длина массива равен 3
{$size: 3}
    // выборка по типу
{$type: number}
</pre>



<h2 class="wp-block-heading" id="target-45">Подключение MongoDB в Node.js</h2>



<pre class="wp-block-preformatted">// Retrieve
var MongoClient = require('mongodb').MongoClient;

// Connect to the db
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});</pre>



<p><a href="https://mongodb.github.io/node-mongodb-native/api-articles/nodekoarticle1.html#getting-that-connection-to-the-database" target="_blank" rel="noreferrer noopener nofollow">соединение с БД mongo DB</a></p>


</br>



<h2 class="wp-block-heading" id="target-46">Mongoose</h2>



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



<h3 class="wp-block-heading" id="target-47">Установка и подключение (работаем через mongoose)</h3>



<pre class="wp-block-preformatted">//install
$ npm install mongoose</pre>



<pre class="wp-block-preformatted">//use
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
    // connect
});</pre>



<h3 class="wp-block-heading" id="target-48">Установка и подключение (работаем через нативный клиент &#8212; MongoClient)</h3>



<pre class="wp-block-preformatted">var MongoClient = require("mongodb").MongoClient;
mongoClient.connect("mongodb://localhost:27017/test", function(err, db){
    if(err){
        return console.log(err);
    }

    // работаем с БД

    db.close();
});</pre>



<h3 class="wp-block-heading" id="target-49">Схема</h3>



<p><strong>Схема</strong> в Mongoose определяет метаданные модели &#8212; ее свойства, типы данных и ряд другой информации. <a href="http://mongoosejs.com/docs/guide.html" target="_blank" rel="noreferrer noopener nofollow">mongoosejs.com/docs/guide.html</a></p>



<pre class="wp-block-preformatted">var mongoose = require('mongoose');
var Schema = mongoose.Schema;


// внутри перечисляем наши поля
var blogSchema = new Schema({
    title:  String,
    author: String,
    body:   String,
    comments: [{ body: String, date: Date }],
    date: {
        type: Date,
        default: Date.now,
        required: [true, 'Укажите дату']
    },
    hidden: Boolean,
    meta: {
        votes: Number,
        favs:  Number
    }
});


var Blog = mongoose.model('Blog', blogSchema);
// ready to go!</pre>



<h3 class="wp-block-heading" id="target-50">Типы схем</h3>



<p><a href="http://mongoosejs.com/docs/schematypes.html" target="_blank" rel="noreferrer noopener nofollow">mongoosejs.com/docs/schematypes.html</a></p>



<ul><li><a href="http://mongoosejs.com/docs/api.html#schema-string-js" target="_blank" rel="noreferrer noopener nofollow">String</a></li><li><a href="http://mongoosejs.com/docs/api.html#schema-number-js" target="_blank" rel="noreferrer noopener nofollow">Number</a></li><li><a href="http://mongoosejs.com/docs/api.html#schema-date-js" target="_blank" rel="noreferrer noopener nofollow">Date</a></li><li><a href="http://mongoosejs.com/docs/api.html#schema-buffer-js" target="_blank" rel="noreferrer noopener nofollow">Buffer</a> (например, для изображений)</li><li>Boolean</li><li>Mixed (любой тип данных)</li><li><a href="http://mongoosejs.com/docs/api.html#schema-objectid-js" target="_blank" rel="noreferrer noopener nofollow">Objectid</a></li><li>Array</li></ul>



<h3 class="wp-block-heading" id="target-51">Модель</h3>



<p><strong>Модели</strong> (<a href="http://mongoosejs.com/docs/models.html" target="_blank" rel="noreferrer noopener nofollow">http://mongoosejs.com/docs/models.html</a>) &#8212; это конструкторы, составленные из определения нашей схемы. Экземпляры модели представляют собой документы, которые могут быть сохранены и извлечены из нашей БД.</p>



<pre class="wp-block-preformatted">var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);</pre>



<p>Первый параметр в методе&nbsp;<code>mongoose.model</code>&nbsp;указывает на название модели, а второй параметр &#8212; схема.</p>



<h3 class="wp-block-heading" id="target-52">Сохраняем объект в БД</h3>



<p>Кроме метода&nbsp;<code>save()</code>&nbsp;также можно использовать метод&nbsp;<code>Person.create()</code>&nbsp;(см. код ниже). Первый параметр метода &#8212; сохраняемый объект.</p>


</br>



<pre class="wp-block-preformatted">var Person = mongoose.model('Person', yourSchema);

var subject = new Person({name: 'John'});

subject.save(function(err) {
    if (err) return handkeError(err);
})

// или

Person.create({name: 'John'}, function(err, subject) {
    if (err) return handkeError(err);
})</pre>



<h3 class="wp-block-heading" id="target-53">Поиск (find, findById, findOne)</h3>



<p><a href="http://mongoosejs.com/docs/queries.html" target="_blank" rel="noreferrer noopener nofollow">http://mongoosejs.com/docs/queries.html</a></p>



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



<p><code>find</code>&nbsp;&#8212; возвращает все объекты, которые соответствуют условию фильтрации.&nbsp;<code>find()</code>&nbsp;в качестве первого параметра принимает условие фильтрации; второй параметр метода&nbsp;<code>find()</code>&nbsp;&#8212; функция обратного вызова, в которую передаются полученные из БД документы. Если в качестве условия фильтрации передаются пустые фигурные скобки (<code>{}</code>), то возвращаются все объекты.</p>



<p><code>findById</code>&nbsp;&#8212; возвращает один объект по значению поля&nbsp;<code>_id</code>. Метод возвращает документ с определенным идентификатором.</p>



<p><code>findOne</code>&nbsp;&#8212; возвращает один объект, который соответствует критерию фильтрации. В отличие от метода&nbsp;<code>find</code>, метод&nbsp;<code>findOne()</code>&nbsp;возвращает один объект.</p>



<pre class="wp-block-preformatted">var Person = mongoose.model('Person', yourSchema);

//  { 'name.last': 'Ghost' }       - условие
//  'name occupation'              - выбираем нужные поля
//  function (err, person) { ...   - обрабатываем данные в callback'е

// find each person with a last name matching 'Ghost', selecting the `name` and `occupation` fields
Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) {
  if (err) return handleError(err);
  console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation)
  // Space Ghost is a talk show host.
})

// находим все
Person.find({ 'name.last': 'Ghost' }, 'name occupation', function (err, docs) {})
// альтернатива callback

Person.find({ 'name.last': 'Ghost' }, 'name occupation').exec(function (err, docs) {})</pre>



<h3 class="wp-block-heading" id="target-54">Редактирование (update, findByIdAndUpdate)</h3>



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



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



<p>Первый параметр метода&nbsp;<code>findByIdAndUpdate()</code>&nbsp;&#8212; значения для поля&nbsp;<code>_id</code>&nbsp;у обновляемого документа, а второй — набор новых значений для полей объекта. В функцию обратного вызова передается обновленный документ.</p>



<pre class="wp-block-preformatted">// меняем Karl на Johny
var query = {name: 'Karl'};

Model.update(query, {name: 'Johny'}, options, callback); // все заменит на  {name: 'Johny'}

Model.update(query, {$set: {name: 'Johny'}}, options, callback); // меняем только поле name

Person.findOne({name: 'Johny'}, function (err, person) {
    if (err) return handleError(err);
    person.name = 'Johny';
    person.save();
})</pre>



<h3 class="wp-block-heading" id="target-55">Удаление (remove, findOneAndRemove)</h3>



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



<p>Метод&nbsp;<code>findOneAndRemove()</code>&nbsp;позволяет удалить один документ. В функцию обратного вызова метод&nbsp;<code>findOneAndRemove()</code>&nbsp;передается удаленный документ.</p>



<p>И частная разновидность этого метода &#8212; удаление по полю&nbsp;<code>_id</code>&nbsp;в виде метода&nbsp;<code>findByIdAndRemove()</code>.</p>



<pre class="wp-block-preformatted">// удаление:
Model.remove({name: 'Johny'}, function (err, person) {
    if (err) return handleError(err);
})</pre>



<h3 class="wp-block-heading" id="target-56">Валидация в Mongoose</h3>



<p><code>Mongoose</code>&nbsp;имеет ряд встроенных правил валидации, которые следует указывать в схеме:</p>



<ul><li><code>required</code>&nbsp;&#8212; обязательно наличие значения для свойства.</li><li><code>min и max</code>&nbsp;&#8212; задают минимальное и максимальное значения для числовых данных.</li><li><code>minlength</code>&nbsp;и&nbsp;<code>maxlength</code>&nbsp;&#8212; задают минимальную и максимальную длину для строк.</li><li><code>enum</code>&nbsp;&#8212; строка должна представлять одно из значений в указанном массиве строк.</li><li><code>match</code>&nbsp;&#8212; строка должна соответствовать регулярному выражению.</li></ul>


</br>



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



<p>Пример:</p>



<pre class="wp-block-preformatted">const personScheme = new Schema({
    name: {
        type: String,
        required: true,
        minlength:3,
        maxlength:15
    },
    age: {
        type: Number,
        required: true,
        min: 1,
        max:125
    }
});</pre>



<h3 class="wp-block-heading" id="target-57">Promise и Mongoose</h3>



<p>С MongoDB можно использовать&nbsp;<code>Promise</code>.</p>



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



<pre class="wp-block-preformatted">user.save()
.then(function(data){
    console.log("Сохранен объект", data);
    mongoose.disconnect();  // отключение от базы данных
})
.catch(function (err){
    console.log(err);
    mongoose.disconnect();
});</pre>



<h2 class="wp-block-heading" id="target-58">mlab.com</h2>



<p><a href="https://mlab.com/" target="_blank" rel="noreferrer noopener nofollow">mlab.com</a> &#8212; это облачный сервис по предоставлению БД mongoDB.</p>



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



<pre class="wp-block-preformatted">mongoose
    .connect(`mongodb://user_name:pass@ds147072.mlab.com:47072/name_bd`);</pre>



<h2 class="wp-block-heading" id="target-59">CRUD</h2>



<p><strong>CRUD</strong>&nbsp;— (create, read, update, delete — «создание, чтение,обновление, удаление») &#8212; 4 основные функции, используемые при работе базами данных.</p>



<h2 class="wp-block-heading" id="target-60">Послесловие</h2>



<p>Node.js, а значит и Mongo, применяется для высоконагруженных проектов, там, где необходимо передавать много информации, чаты, игры.</p>
<p>Сообщение <a href="https://clip-clap.ru/it/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d0%bf%d0%be-mongodb-mongoose/">Подробное руководство по MongoDB, Mongoose</a> появились сначала на <a href="https://clip-clap.ru">Clip-Clap</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://clip-clap.ru/it/%d0%b0%d0%b4%d0%bc%d0%b8%d0%bd%d0%b8%d1%81%d1%82%d1%80%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d0%bf%d0%be-mongodb-mongoose/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Кэширование страницы с использованием Disk: Enhanced 
Минифицировано с помощью Disk
Кэширование запросов БД 6/32 за 0.044 секунд с использованием Disk (Request-wide (широкий запрос) modification query)

Served from: clip-clap.ru @ 2026-07-03 04:04:23 by W3 Total Cache
-->