Создание простого блога на mongodb и php

Bulk write

The method executes one or
more write operations, including inserts, updates, and deletes.

bulkwrite.php

<?php

try {
     
    $mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    
    $bulk = new MongoDB\Driver\BulkWrite;
    
    $doc = ;
    $bulk->insert($doc);
    $bulk->update(, ]);
    $bulk->delete();
    
    $mng->executeBulkWrite('testdb.cars', $bulk);
        
} catch (MongoDB\Driver\Exception\Exception $e) {

    $filename = basename(__FILE__);
    
    echo "The $filename script has experienced an error.\n"; 
    echo "It failed with the following exception:\n";
    
    echo "Exception:", $e->getMessage(), "\n";
    echo "In file:", $e->getFile(), "\n";
    echo "On line:", $e->getLine(), "\n";    
}

?>

The script inserts a new car, updates one car, and deletes one car.

$bulk = new MongoDB\Driver\BulkWrite();

The collects one or more write
operations that should be sent to the server.

$doc = ;

This is a new document to be inserted. The generates
a new ObjectId. It is a value used to uniquely identify documents in a collection.

$bulk->insert($doc);

An insert operation is created with the method.

$bulk->update(, ]);

An update operation is created with the method.
The operator replaces the value of a field with the
specified value.

$bulk->delete();

A delete operation is created with the method.

$mng->executeBulkWrite('testdb.cars', $bulk);

The executes the three operations
on the collection.

> db.cars.find()
{ "_id" : ObjectId("571e05a6c4a3bc7dc758b457"), "name" : "Audi", "price" : 52000 }
{ "_id" : ObjectId("571e05b5c4a3bc7dc758b458"), "name" : "Mercedes", "price" : 57127 }
{ "_id" : ObjectId("571e05bec4a3bc7dc758b459"), "name" : "Skoda", "price" : 9000 }
{ "_id" : ObjectId("571e05c7c4a3bc7dc758b45a"), "name" : "Volvo", "price" : 29000 }
{ "_id" : ObjectId("571e05d0c4a3bc7dc758b45b"), "name" : "Bentley", "price" : 350000 }
{ "_id" : ObjectId("571e05e0c4a3bc7dc758b45c"), "name" : "Citroen", "price" : 21000 }
{ "_id" : ObjectId("571e05fcc4a3bc7dc758b45e"), "name" : "Volkswagen", "price" : 21600 }
{ "_id" : ObjectId("5720a4e581365b0e9414d0e1"), "name" : "Toyota", "price" : 26700 }

With the tool we confirm the changes.

In this tutorial, we have worked with MongoDB and PHP.

Основы

mongod.exe Запуск сервера MongoDB
mongod.exe -dbpath E:\mongodata при запуске можно задать каталог для баз данных
mongo.exe после удачного запуска сервера мы сможем производить операции с бд через оболочку
Создание коллекции и объекта в ней
вывод содержимого коллекции
use info установить нужную нам базу данных в качестве текущей
show dbs вывести названия всех имеющихся бд
db узнать, какая бд используется в текущей момент
show collections просмотреть список всех коллекций в текущей бд

Добавление данных и создание коллекций

db.users.insert ({«name»: «Tom», «age»: 28, languages: }) Для вставки в коллекцию используется функция insert
document=({«name»: «Bill», «age»: 32, languages: })

db.users.insert(document)

Некоторые ограничения при использовании имен ключей:
  • Символ  не может быть первым символом в имени ключа
  • Имя ключа не может содержать символ точки 
  •  не рекомендуется использовать
db.users.profiles и db.users.accounts Для упрощения организации данных в коллекциях мы можем использовать подколлекции. они не будут никак связаны с коллекцией users
db.users.renameCollection(«новое_название») Переименование коллекции
db.createCollection(name, options) Явное создание коллекции

Ограниченные коллекции

когда в коллекции уже нет места, наиболее старые документы удаляются, и в конец добавляются новые данные. Когда в коллекции уже нет места, наиболее старые документы удаляются, и в конец добавляются новые данные. если все место под коллекцию заполнено (например, выделенные нами 9500 байтов), а количество документов еще не достигло максимума, в данном случае 150, то в этом случае при добавлении нового документа самый старый документ будет удаляться, а на его место будет вставляться новый документ.

db.createCollection(«profile», {capped:true, size:9500}) создадим ограниченную коллекцию с названием profile и зададим для нее размер в 9500 байт
db.createCollection(«profile», {capped:true, size:9500, max: 150}) ограничить количество документов в коллекции, указав его в параметре max. если все место под коллекцию заполнено (например, выделенные нами 9500 байтов), а количество документов еще не достигло максимума, в данном случае 150, то в этом случае при добавлении нового документа самый старый документ будет удаляться, а на его место будет вставляться новый документ.

Получение документов

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

Результат выполнения:

Возможно, вы заметили, что ObjectId поста установлен под ключом _id, который мы можем позже использовать для уникальной идентификации, если это необходимо. Если мы хотим найти более одного документа, мы можем использовать метод find(). На этот раз давайте найдем все посты, написанные Скоттом:

Запуск

SQL vs NoSQL

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

Когда дело доходит до выбора, большинству людей приходится задавать себе вопрос: «SQL или NoSQL?». Как SQL, так и NoSQL имеют свои сильные и слабые стороны, и вам следует выбрать тот, который наилучшим образом соответствует требованиям вашего приложения. Вот несколько различий между ними:

SQL

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

NoSQL

  • Нереляционная модель
  • Может храниться как JSON, ключ-значение и т. д. (В зависимости от типа базы данных NoSQL)
  • Не каждая запись должна быть одинаковой, что делает ее очень гибкой
  • Добавление новых свойств ничего не нарушает
  • Нет жестких требований к структуре
  • Поддержка транзакций ACID может варьироваться в зависимости от того, какая база данных NoSQL используется.
  • Типы могут варьироваться
  • Хорошо масштабируется по горизонтали

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

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

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

В последние годы базы данных SQL и NoSQL даже начали объединяться. Например, PostgreSQL теперь поддерживает хранение и запросы данных JSON, как и Mongo. Таким образом, теперь вы можете добиться того же с Postgres, что и с Mongo, но вы по-прежнему не имеете многих преимуществ Mongo (таких как горизонтальное масштабирование и простой интерфейс и т. д.).

Если ваши данные удобно размещать в реляционной схеме, а содержимое JSON является группой, то вам будет проще с PostgreSQL и его гораздо более эффективными возможностями представления и индексирования JSONB. Тем не менее, если ваша модель данных представляет собой набор изменяемых документов, то вам, вероятно, стоит взглянуть на базу данных, созданную в основном для JSON-документов, таких как MongoDB или RethinkDB.

Обновление данных

save

В качестве параметра этот метод принимает документ.

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

Если параметр _id не указан, то документ вставляется, а параметр _id генерируется автоматически как при обычном добавлении через функцию insert:

 db.users.save({name: «Eugene», age : 29, languages: })

update

Более детальную настройку при обновлении предлагает функция update. Она принимает три параметра:

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

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

Обновление отдельного поля

Указав значение , мы можем обновить все документы выборки:

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

 db.users.update({name : «Tom»}, {$unset: {salary: 1}})  Для удаления отдельного ключа используется оператор $unset:
 db.users.update({name : «Tom»}, {$unset: {salary: 1, age: 1}})  можно удалять сразу несколько полей:
 db.users.update({name : «Tom»}, {$push: {languages: «russian»}})  Оператор $push позволяет добавить еще одно значение к уже существующему. Например, если ключ в качестве значения хранит массив:
 db.users.update({name : «Tom»}, {$addToSet: {languages: «russian»}})  $addToSet добавляет данные, если их еще нет в массиве:
 db.users.update({name : «Tom»}, {$addToSet: {languages: {$each: }}})  Используя оператор , можно добавить сразу несколько значений:
 db.users.update({name : «Tom»}, {$pop: {languages: 1}})  Оператор $pop позволяет удалять элемент из массива:
 db.users.update({name : «Tom»}, {$pop: {languages: -1}})  Указывая для ключа languages значение 1, мы удаляем первый элемент с конца
 db.users.update({name : «Tom»}, {$pull: {languages: «english»}})  $pull. Он удаляет каждое вхождение элемента в массив,например, если он повторяется.
 db.users.update({name : «Tom»}, {$pullAll: {languages: }})  если мы хотим удалить не одно значение, а сразу несколько, тогда мы можем применить оператор $pullAll:

#Installing the PHP Extension

Now that we have installed, we can configure Apache to use to interpret our web content, translating our commands instead of displaying the source code.

Install the PHP MongoDB Extension before installing the PHP Library for MongoDB. It is worth noting, that full MongoDB driver experience is provided by installing both the low-level extension (which integrates with our C driver) and high-level library, which is written in PHP.

You can install the extension using PECL on the command line:

copy code

To install the extension, copy the following line and place it at the end of your file.

copy code

To verify installation, you can use the following command.

copy code

You should see output similar to the following:

copy code

You are now ready to begin using PHP to manipulate and manage data in your MongoDB databases. Next, we’ll focus on getting your MongoDB cluster prepared.

Start a MongoDB Cluster on Atlas

Now that you’ve got your local environment set up, it’s time to create a MongoDB database to work with, and to load in some sample data you can explore and modify.

It will take a couple of minutes for your cluster to be provisioned, so while you’re waiting, you can move on to the next step.

Set Up Your MongoDB Instance

Hopefully, your MongoDB cluster should have finished starting up now and has probably been running for a few minutes.

The following instructions were correct at the time of writing but may change, as we’re always improving the Atlas user interface:

In the Atlas web interface, you should see a green button at the bottom-left of the screen, saying «Get Started.» If you click on it, it’ll bring up a checklist of steps for getting your database set up. Click on each of the items in the list (including the «Load Sample Data» item—we’ll use this later to test the PHP library), and it’ll help you through the steps to get set up.

The fastest way to get access to data is to load the sample datasets into your cluster right in the Atlas console. If you’re brand new, the new user wizard will actually walk you through the process and prompt you to load these.

If you already created your cluster and want to go back to load the sample datasets, click the ellipsis (three dots) next to your cluster connection buttons (see below image) and then select .

Now, let’s move on to setting the configuration necessary to access your data in the MongoDB Cluster. You will need to create a database user and configure your IP Address Access List.

SQL vs. NoSQL: MySQL или MongoDB

Разобравшись с ключевыми структурными различиями SQL и NoSQL баз данных, стоит внимательно рассмотреть их функциональные особенности на примере MySQL и MongoDB.

MySQL: реляционная СУБД

Преимущества MySQL:

  • Проверено временем: MySQL — крайне развитая СУБД, что означает наличие большого сообщества вокруг неё, множество примеров и высокую надёжность;
  • Совместимость: MySQL доступна на всех основных платформах, включая Linux, Windows, Mac, BSD и Solaris. Также у неё есть библиотеки для языков вроде Node.js, Ruby, C#, C++, Java, Perl, Python и PHP;
  • Окупаемость: Это СУБД с открытым исходным кодом, находящаяся в свободном доступе;
  • Реплицируемость: Базу данных MySQL можно распределять между несколькими узлами, таким образом уменьшая нагрузку и улучшая масштабируемость и доступность приложения;
  • Шардинг: В то время как шардинг невозможен на большинстве SQL баз данных, MySQL является исключением.

MongoDB: нереляционная СУБД

Преимущества MongoDB:

  • Динамическая схема: Как упоминалось выше, эта СУБД позволяет гибко работать со схемой данных без необходимости изменять сами данные;
  • Масштабируемость: MongoDB горизонтально масштабируема, что позволяет легко уменьшить нагрузку на сервера при больших объёмах данных;
  • Удобство в управлении: СУБД не нуждается в отдельном администраторе базы данных. Благодаря достаточному удобству в использовании, ей легко могут пользоваться как разработчики, так и системные администраторы;
  • Скорость: Высокая производительность при выполнении простых запросов;
  • Гибкость: В MongoDB можно без вреда для существующих данных, их структуры и производительности СУБД добавлять поля или колонки.

Какую СУБД выбрать?

MySQL — верный выбор для любого проекта, который может положиться на предопределённую структуру и заданные схемы. С другой стороны, MongoDB — отличный вариант для быстрорастущих проектов без определённой схемы данных. В особенности если вы не можете определить схему для своей базы данных, вам не подходит ни одна из предлагаемых другими СУБД или в вашем проекте она постоянно меняется, как, например, в случае с мобильными приложениями, системами аналитики в реальном времени или контент-менеджмента.

Перевод статьи «The SQL vs NoSQL Difference: MySQL vs MongoDB»

Как появилась MongoDB: краткая история

Разработка МонгоДБ началась в 2007 году компанией 10gen. В 2009 году компания перешла на модель разработки продуктов с открытым исходным кодом. 11 февраля 2009 года была выпущена первая версия МонгоДБ 1.0. 27 августа 2013 года компания 10gen изменила свое название на MongoDB, Inc. 20 октября 2017 года MongoDB стала публичной компанией, свободно существовавшей на фондовом рынке. 5 декабря 2019 года была выпущена МонгоДБ с версией 4.2.2. Спустя 8 месяцев, 21 апреля 2020 года, состоялся релиз последней на данный момент версии MongoDB 4.2.6 .

Таким образом, благодаря своей документно-ориентированной структуре, MongoDB может довольно быстро получать доступ к хранимой информации, так как в отличие от реляционных СУБД, для получения данных в MongoDB не используются сложные JOIN-запросы (для соединения таблиц). Это делает MongoDB весьма удобным средством для работы с Big Data.

Больше подробностей про применение MongoDB в проектах анализа больших данных вы узнаете на практических курсах по NoSQL в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:

IMPA: CLOUDERA IMPALA DATA ANALYTICSADQM: ЭКСПЛУАТАЦИЯ ARENADATA QUICKMARTSADBR: Arenadata DB для разработчиковADB: Эксплуатация Arenadata DBHBASE: Администрирование кластера HBaseHIVE: Hadoop SQL администратор HiveNoSQL: Интеграция Hadoop и NoSQL

Источники

  1. https://ru.wikipedia.org/wiki/MongoDB

Основы

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

Database

В mongodb у вас может быть несколько баз данных на одном сервере mongodb для коллективного хранения данных. Например. Если вы работаете над школьным приложением, вы должны создать школьную базу данных, в которой находятся все ваши коллекции (аналогичные таблице в sql). Эта база данных может содержать коллекцию студентов, коллекцию учителей и т. д.

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

> show dbs

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

> use <database name>

Коллекции

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

Коллекции содержат несколько документов в одном месте.

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

Вот некоторые полезные команды, которые следует знать для работы с коллекциями: (переключитесь на выбранную базу данных с помощью use <database name>, чтобы использовать эти команды)

# показать все коллекции в БД
> show collections

# использовать выбранную коллекцию
> db.<collection name>.find()

Документы

Документы — это основные записи, содержащие вашу информацию в формате JSON.

{
   "name": "Ash Ketchum",
   "age": 20,
   "subjects": ,
   "standard": 8
}

Создать документ так же просто, как создать объект в javascript. Туда вы можете записывать любые значения. А так же включать документ внутрь документов. У вас могут быть массивы, объекты, логические значения, числа, строки и т. д. Это делает mongodb подходящим для иерархических данных, где требуется вложенность.

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

В следующем посте будут рассмотрены основные операции CRUD.

Буду признателен любым предложениям (Прим. перевод. — В блоге автора статьи).

Надеюсь, вы найдете его полезным и узнали из него что-то новое.

Удачного кодирования

Spread the love

Изменение роли реплики в кластере

Чтобы изменить роль осколка в кластере необходимо изменить его приоритет. Для этого нужно открыть консоль MongoDB и воспользоваться javascript:

cfg = rs.conf()
cfg.members.priority = 10
rs.reconfig(cfg)

Здесь я присвоил четвертому («новому», нумерация с нуля как обычно) элементу массива rs.conf() приоритет 10 (у остальных ниже). Теперь он получил роль primary

cfg = rs.conf()
cfg.members.splice(1,1)
rs.reconfig(cfg)

Здесь я удалил второй (тот что ранее был primary) элемент массива rs.conf(), т.е. вывел его из кластера. Сами роли можно посмотреть выполнив rs.conf() соответственно.

Установка

На странице MongoDB Community Downloads смотрим стабильные версии программного продукта. На момент обновления инструкции это была 4.4.

Обратите внимание, установка MongoDB возможна на большое число популярных операционных систем — Amazon, Debian, Ubuntu, macOS, CentOS, Red Hat, Windows и другие. Переходим на страницу загрузки ключей для проверки подлинности репозитория

Копируем ссылку для версии MongoDB, которую мы планируем установить:

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

* в данном примере мы скопировали ссылку на ключ для версии 4.4

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

С помощью скопированной ссылки скачиваем и устанавливаем ключ:

wget -qO — https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add —

Создаем файл для настройки репозитория Ubuntu:

vi /etc/apt/sources.list.d/mongodb-org.list

Добавляем строку:

deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse

* focal — название релиза Ubuntu. В данном примере, версия 20.04. На данный момент возможны варианты:

  • focal: 20.04.
  • bionic: 18.04.
  • xenial: 16.04.

Обновляем список пакетов:

apt-get update

Устанавливаем MongoDB:

apt-get install mongodb-org

Стартуем сервис и разрешаем его автозапуск:

systemctl start mongod

systemctl enable mongod

Для подключения к СУБД вводим команду:

mongo

Можно для проверки ввести команду, которая покажет созданные базы данных:

> show databases;

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

admin   0.000GB
config  0.000GB
local   0.000GB

В качестве примера работы мы можем попробовать создать новую базу данных и коллекцию. Объекты в MongoDB создаются автоматически при первом к ним обращении.

Для создания базы просто обращается к ней:

> use newDB

* в данном примере будут создана база newDB.

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

> db.newCollection.insertOne( { x: 1 } )

Выходим из оболочки SQL:

> exit

Установка завершена.

Как установить MongoDB в Linux (Debian 10)

Давайте быстро рассмотрим, как установить MongoDB Community Edition на Debian 10.

Примечание
Убедитесь, что вы удалили пакет MongoDB, поддерживаемый Debian, потому что это не официальный пакет MongoDB, и невозможность его удаления может конфликтовать с последней версией:

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

sudo apt-get update && sudo apt-get upgrade -y

Затем установите GnuPG и импортируйте открытый ключ репозитория MongoDB с помощью команды:

sudo apt-get install gnupg && wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

Добавьте список файлов в каталог sources.list.d с помощью команды:

echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

Обновите свои локальные репозитории и установите пакет mongodb-org.

sudo apt-get update && sudo apt-get install mongodb-org

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

sudo systemctl start mongod

Вы также можете запустить оболочку mongo с помощью команды mongo.

Projections

Projections can be used to specify which fields should be
returned.

projection.php

<?php

try {
     
    $filter = [];
    $options = ];
    
    $mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    $query = new MongoDB\Driver\Query($filter, $options);
    
    $rows = $mng->executeQuery("testdb.cars", $query);
       
    foreach ($rows as $row) {
          
           print_r($row);
    }    
        
} catch (MongoDB\Driver\Exception\Exception $e) {

    $filename = basename(__FILE__);
    
    echo "The $filename script has experienced an error.\n"; 
    echo "It failed with the following exception:\n";
    
    echo "Exception:", $e->getMessage(), "\n";
    echo "In file:", $e->getFile(), "\n";
    echo "On line:", $e->getLine(), "\n";    
}

?>

In the example, we hide the first field—the .

$options = ];

Projections are specified in a array. Here
we hide the field.

$query = new MongoDB\Driver\Query($filter, $options);     

The projections are passed in the second argument of the .

$ php projection.php 
stdClass Object
(
     => Audi
     => 52642
)
stdClass Object
(
     => Mercedes
     => 57127
)
...

This is the partial output of the script. Only the name and
price fields are returned.

Как использовать PyMongo для подключения к MongoDB

Чтобы подключиться к MongoDB с помощью PyMongo, мы используем объект MongoClient и создаем экземпляр для mongod, основного процесса демона для MongoDB.

>>> from pymongo import MongoClient
>>> client = MongoClient(“localhost”, 27017)

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

Вы также можете использовать формат URI MongoDB как:

>>> client = MongoClient("mongodb://localhost:27017/")

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

Запросы в MongoDB

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

db.Data.find({});

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

db.Data.distinct("param1");

Если у нас param1 равен, например, «чек», то можно посчитать их общее количество в базе данных запросом:

db.Data.count({"param1":"чек"});

Объект запроса в find и count может быть сложным. В процессе написания API получил предупреждение о устаревшем методе update. Потому использовал инкрементальные updateOne и updateMany для обновления одного и всех документов соответственно. Особенности тут такие:

db.Data.updateMany({"param1":"чек"}, {"$set":{"param1":"документчек", "param2":"чек"}, "$unset":{"param3":null}}, {upsert: true})

Здесь у нас строка поиска {«param1″:»чек»}, найденным документам мы меняем param1 на документчек, а param2 на чек, param3 же удаляем. $set или $unset можем опустить. Третий параметр {upsert: true} также можно опустить, он указывает на то, что если документ удовлетворяющий параметрам поиска не будет найден, то он будет добавлен в базу.

Запрос с поиском по массиву (id и val должны удовлетворять условию одновременно):

db.Data.find({"param1": ..., "r_param" : { "$elemMatch" : { "id" : ..., "val" : ... } }})

Т.е. в массиве 

При запросе 

db.Data.find({"param1": ..., "r_param" : { "$elemMatch" : { "id" : 1, "val" : "a" } }})

будет найден один (первый) элемент.

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

db.Data.aggregate(,{ allowDiskUse: true });

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

В данном случае первый аргумент массива действий агрегации группирует ($group) документы по ключу param1, при этом создается документ типа {_id: (param1), count: (number), dups:}, где count — количество документов с данным param1, а dups — массив оригинальных _id документов.

Второй аргумент массива действий агрегации отбирает из выборки документы с count > 1 (т.е. наши дубликаты).

параметр allowDiskUse позволяет при агрегации использовать ПЗУ, т.к. агрегация может быть очень затратной операцией и объема ОЗУ может быть недостаточно, как было в моем случае.

Чтобы не удалять документы вручную, допишем в нашей функции агрегации перебор документов:

db.Data.aggregate(,{ allowDiskUse: true }).forEach(function(doc){
  doc.dups.shift();
  db.Data.remove({_id : {$in: doc.dups}});
});

В данном скрипте, мы удаляем первый элемент массива dups, а после чего удаляем документы с _id совпадающими с оставшимися в массиве dups.

Агрегацией же, например, API удаляет устаревшие документы:

db.Request.aggregate(}
		]},
		remove: []
	}
},
{
	$match:{difference:{"$gt":0}}
},
{
	$group:{_id:"removable", remove:{$push:"$_id"}}
}
],
{ allowDiskUse: true }).forEach(function(doc){
	db.Request.deleteMany({_id : {$in: doc.remove}});
});

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

client.db(CONFIG.mongodb.database).collection('Request').aggregate(}
		]},
		remove: []
	}
},
{
	$match:{difference:{"$gt":0}}
},
{
	$group:{_id:"removable", remove:{$push:"$_id"}}
}
],
{ allowDiskUse: true }).forEach(function(doc){
	client.db(CONFIG.mongodb.database).collection('Request').deleteMany({_id : {$in: doc.remove}});
});

Определение документа

Чтобы настроить объект документа, нам нужно определить, какие данные мы хотим получать. Подобно многим другим ORM, сделаем это путем создания подкласса класса Document, предоставив типы данных, которые мы хотим получить:

Одной из наиболее сложных задач с моделями баз данных является проверка данных. Как убедиться, что сохраняемые данные соответствуют нужному формату? То, что база данных называется «бессхемовой», не означает, что она не содержит схем.

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

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

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

Мы можем установить еще несколько таких параметров, в том числе:

  • db_field: другое имя поля
  • required: убедитесь, что это поле установлено
  • default: использовать заданное значение по умолчанию, если не указано другое значение
  • unique: убедитесь, что ни один другой документ в коллекции не имеет такого же значения для этого поля
  • choices: убедитесь, что значение поля равно одному из значений, указанных в массиве

Размещение бесплатного экземпляра mongodb для проектов в MongoDB Atlas

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

Чтобы создавать веб-приложения с помощью базы данных MongoDB можно использовать три пути:

  1. Для создания базы данных MongoDB и разработки приложения использовать собственный компьютер. Для этого вы должны установить сервер Node и сервер базы данных MongoDB на своем ПК.
  2. Для создания базы данных MongoDB использовать облачный сервис MongoDB Atlas, а приложение разрабатывать и запускать на локальном ПК. Этот способ будет рассмотрен в данной статье.
  3. Для создания базы данных MongoDB использовать облачный сервис MongoDB Atlas, а приложение разрабатывать и запускать на каком-нибудь облачном сервисе, например Glitch.

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

Reading data

is a value object that represents a database query.

read_all.php

<?php

try {

    $mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    $query = new MongoDB\Driver\Query([]); 
     
    $rows = $mng->executeQuery("testdb.cars", $query);
    
    foreach ($rows as $row) {
    
        echo "$row->name : $row->price\n";
    }
    
} catch (MongoDB\Driver\Exception\Exception $e) {

    $filename = basename(__FILE__);
    
    echo "The $filename script has experienced an error.\n"; 
    echo "It failed with the following exception:\n";
    
    echo "Exception:", $e->getMessage(), "\n";
    echo "In file:", $e->getFile(), "\n";
    echo "On line:", $e->getLine(), "\n";       
}

?>

The example reads all data from the collection.

$query = new MongoDB\Driver\Query([]); 

A object is created. If we pass an empty array,
it reads all data.

$rows = $mng->executeQuery("testdb.cars", $query);

The executes the query. The first parameter is
the collection name and the second parameter is the query.

foreach ($rows as $row) {

    echo "$row->name : $row->price\n";
}

We iterate over all matched documents.

$ php read_all.php 
Audi : 52642
Mercedes : 57127
Skoda : 9000
Volvo : 29000
Bentley : 350000
Citroen : 21000
Hummer : 41400
Volkswagen : 21600

This is the output of the script.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: