MONGODB » История » Версия 2
Александр Александров, 26.04.2019 16:48
1 | 1 | Александр Александров | h1. MONGODB |
---|---|---|---|
2 | |||
3 | h2. Вопросы |
||
4 | |||
5 | # Что такое NoSQL? |
||
6 | 2 | Александр Александров | # Какие есть типы хранилищ данных в NoSQL? |
7 | 1 | Александр Александров | # Что такое MongoDB? |
8 | # На каком языке написана MongoDB? |
||
9 | # Какие языки программирования можно использовать с MongoDB? |
||
10 | # Использует ли таблицы для хранения данных, база данных MongoDB? |
||
11 | # Какие преимущества MongoDB? |
||
12 | # Какие недостатки MongoDB? |
||
13 | # Что такое пространство имен в MongoDB? |
||
14 | # Что такое репликация? |
||
15 | # Поддерживает ли MongoDB ограничения внешнего ключа(foreign key)? |
||
16 | # Как мы можем достичь primary key - foreign key отношения в MongoDB? |
||
17 | # Объясните структуру ObjectID в MongoDB. |
||
18 | # Если удалить документ из базыданных, удалится ли он с диска? |
||
19 | # Что такое индексы в MongoDB? |
||
20 | # Сколько индексов создается по умолчанию в MongoDB для новой коллекции? |
||
21 | # Что такое скрытый запрос в MongoDB? |
||
22 | # Поддерживает ли MongoDB поиск текста? |
||
23 | # Какая команда позволяет получить все индексы определенной коллекции? |
||
24 | # Что такое Шардинг в MongoDB? |
||
25 | # По умолчанию, MongoDB пишет и читает данные из primary и secondary наборов реплик. Правда ето или ложь? |
||
26 | # Почему MongoDB не является предпочтительным решением для 32-битных систем? |
||
27 | # Какая команда,позволяет проверить, являетесь ли вы на главном сервере или нет? |
||
28 | # Что такое GridFS? |
||
29 | # Что такое Map/Reduce? |
||
30 | # Каков создать/удалить коллекцию в MongoDB? |
||
31 | # Какова роль профайлера в MongoDB? |
||
32 | # Какая команда позволяет вставить документ? |
||
33 | # Приведите пример использования индекса в MongoDB. |
||
34 | # Какой метод вернёт список всех документов в колекции? |
||
35 | # Что такое селекторы запросов в MongoDB? |
||
36 | # Что вы знаете об обновлении/вставке в MongoDB? |
||
37 | # Что вы знаете об условных оператораторах в MongoDB? |
||
38 | # Как удалить документ в MongoDB? |
||
39 | |||
40 | h2. Ответы |
||
41 | |||
42 | h3. Что такое NoSQL? |
||
43 | |||
44 | 2 | Александр Александров | NoSQL (Not only SQL) - это ряд технологий, подходов, проектов направленных на реализацию моделей баз данных, имеющих существенные отличия от традиционных СУБД, работающих с языком SQL. Концепция NoSQL не отрицает SQL, она лишь стремится решить проблемы и вопросы, с которыми не достаточно хорошо справляется РСУБД. Чаще всего данные в NoSQL решении представляются в виде хеш-таблиц, деревьев, документов и пр. |
45 | |||
46 | h3. Какие есть типы хранилищ данных в NoSQL? |
||
47 | |||
48 | В зависимости от модели данных и подходов к распределённости и репликации можно выделить четыре типа хранилищ: |
||
49 | |||
50 | * "ключ-значение" (key-value store) |
||
51 | * документно-ориентированные (document store) |
||
52 | * хранилища семейств колонок (column database) |
||
53 | * графовые базы данных (graph database) |
||
54 | |||
55 | 1 | Александр Александров | h3. Что такое MongoDB? |
56 | |||
57 | 2 | Александр Александров | MongoDb - это документо-ориентированная база данных, в отличие от традиционных реляционных баз данных, таких как MySQL или PostgreSQL не использует табличный способ представления со связями через внешние ключи, основанная на принципе хранении документов в BSON(Binary JSON) формате. Т.е. каждая запись это документ, без жестко заданной схемы, который может содержать вложенные документы. |
58 | |||
59 | 1 | Александр Александров | h3. На каком языке написана MongoDB? |
60 | |||
61 | 2 | Александр Александров | MongoDB написана и реализована на С++. |
62 | |||
63 | 1 | Александр Александров | h3. Какие языки программирования можно использовать с MongoDB? |
64 | |||
65 | 2 | Александр Александров | Клиентские драйверы MongoDB поддерживают все популярные языки программирования, так что выбор языка не является проблемой. Вы можете использовать любой язык, какой хотите. |
66 | |||
67 | 1 | Александр Александров | h3. Использует ли таблицы для хранения данных, база данных MongoDB? |
68 | |||
69 | 2 | Александр Александров | Нет. Для хранения данных вместо таблиц, MongoDB использует "Коллекции" (collections). |
70 | 1 | Александр Александров | |
71 | h3. Какие преимущества MongoDB? |
||
72 | |||
73 | 2 | Александр Александров | Основные возможности MongoDB: |
74 | |||
75 | * Документо-ориентированное хранилище (простая и мощная JSON-подобная схема данных) |
||
76 | * Достаточно гибкий язык для формирования запросов |
||
77 | * Динамические запросы |
||
78 | * Полная поддержка индексов |
||
79 | * Профилирование запросов |
||
80 | * Быстрые обновления "на месте" |
||
81 | * Эффективное хранение двоичных данных больших объёмов, напр., фото и видео |
||
82 | * Журналирование операций, модифицирующих данные в БД |
||
83 | * Поддержка отказоустойчивости и масштабируемости: асинхронная репликация, набор реплик и шардинг |
||
84 | * Может работать в соответствии с парадигмой MapReduce |
||
85 | * Имеет распределенный доступ к данным, расположенных на нескольких серверах |
||
86 | |||
87 | 1 | Александр Александров | h3. Какие недостатки MongoDB? |
88 | |||
89 | 2 | Александр Александров | * Отсутствует оператор "join". Обычно данные могут быть организованы более денормализованным способом, но на разработчиков ложится дополнительная нагрузка по обеспечению непротиворечивости данных. |
90 | * Нет такого понятия, как "транзакция". Атомарность гарантируется только на уровне целого документа, т.е. частичное обновление документа произойти не может. |
||
91 | * Отсутствует понятие "изоляции". Любые данные, которые считываются одним клиентом, могут параллельно изменяться другим клиентом. |
||
92 | * Менее чем более стабильна, не рекомендовано использовать в биллинге. |
||
93 | * Требовательна к ресурсам - память и место на диске. |
||
94 | |||
95 | 1 | Александр Александров | h3. Что такое пространство имен в MongoDB? |
96 | |||
97 | 2 | Александр Александров | Пространство имен в MongoDB это конкатенация имени базы данных и названия коллекции. Для например school.students, где school - имя базы данных и students - название коллекции. |
98 | |||
99 | 1 | Александр Александров | h3. Что такое репликация? |
100 | |||
101 | 2 | Александр Александров | Репликация - это процесс синхронизации данных между несколькими серверами. Позволяет добиться большей масштабируемости, и повысить доступность и сохранность данных. Репликация также позволяет восстанавливать даные после сбоя аппаратного обеспечения. С помощью дополнительных копий данных, вы можете выделить один сервер для аварийного восстановления, отчетности или резервного копирования. MongoDB поддерживает 2 формы репликации: |
102 | |||
103 | * реплисеты(Replica Sets ); |
||
104 | * ведущий-ведомый(Master-Slave). |
||
105 | |||
106 | 1 | Александр Александров | h3. Поддерживает ли MongoDB ограничения внешнего ключа(foreign key)? |
107 | |||
108 | 2 | Александр Александров | Нет. |
109 | |||
110 | 1 | Александр Александров | h3. Как мы можем достичь primary key - foreign key отношения в MongoDB? |
111 | |||
112 | 2 | Александр Александров | По умолчанию MongoDB не поддерживает primary key - foreign key отношения. Тем не менее, мы можем достичь этой концепции путем встраивания одного документа внутри другого. Для например документ "адрес" может быть встроен внутри документа "клиент". |
113 | |||
114 | 1 | Александр Александров | h3. Объясните структуру ObjectID в MongoDB. |
115 | |||
116 | 2 | Александр Александров | ObjectID это 12-байт типа BSON, имеющий следующую структуру:. |
117 | |||
118 | * Первые 4 байта, представляющие секунды с эпохи Unix |
||
119 | * Следующие 3 байта являются идентификатором машины |
||
120 | * Следующие 2 байта являются идентификатором процесса |
||
121 | * Последние 3 байта ето случайная величина счетчика: |
||
122 | |||
123 | MongoDB использует ObjectID как значение по умолчанию поля _id каждого документа, который генерируется во время создания любого документа. ObjectID делает все поля _id уникальными. Для создания нового ObjectID используется следующий код: NewObjectId = ObjectId(); |
||
124 | |||
125 | 1 | Александр Александров | h3. Если удалить документ из базыданных, удалится ли он с диска? |
126 | |||
127 | 2 | Александр Александров | Да. Удаление документа из базы данных приведет к его удалению с диска. |
128 | |||
129 | 1 | Александр Александров | h3. Что такое индексы в MongoDB? |
130 | |||
131 | 2 | Александр Александров | Индексы - ето специальная структура данных, которая хранит небольшую часть набора данных. Индекс сохраняет значение конкретного поля или набора полей, упорядоченных по величине поля, как указано в индексе. Индексы поддерживать эффективное выполнение запросов. Без индексов, MongoDB должна сканировать каждый документ коллекции, чтобы выбрать те документы, которые соответствуют оператору запроса. Это сканирование крайне неэффективно и требует от MongoDB обработки большого объема данных. Индексы в MongoDB работают схожим образом с индексами в реляционных базах данных: они ускоряют выборку и сортировку данных. Индексы создаются с помощью ensureIndex. |
132 | |||
133 | 1 | Александр Александров | h3. Сколько индексов создается по умолчанию в MongoDB для новой коллекции? |
134 | |||
135 | 2 | Александр Александров | По умолчанию, MongoDB создает только _id для каждой коллекции. |
136 | |||
137 | 1 | Александр Александров | h3. Что такое скрытый запрос в MongoDB? |
138 | |||
139 | 2 | Александр Александров | В соответствии с официальной документации MongoDB, скрытый запрос ето запрос в котором: |
140 | |||
141 | * все поля в запросе являются частью индекса используемого в запросе; |
||
142 | * все поля в запросе возвращаются в том же индексе. |
||
143 | |||
144 | 1 | Александр Александров | h3. Поддерживает ли MongoDB поиск текста? |
145 | |||
146 | 2 | Александр Александров | Да. MongoDB поддерживает создание текстовых индексов для поддержки поиска текста внутри строки. Эта функция, была введена в версии 2.6. |
147 | |||
148 | 1 | Александр Александров | h3. Какая команда позволяет получить все индексы определенной коллекции? |
149 | |||
150 | 2 | Александр Александров | <pre> |
151 | db.collection.getIndexs() |
||
152 | </pre> |
||
153 | |||
154 | 1 | Александр Александров | h3. Что такое Шардинг в MongoDB? |
155 | |||
156 | 2 | Александр Александров | Шардинг - это подход к масштабируемости, когда отдельные части данных хранятся на разных серверах. Шардинг решает проблему горизонтального масштабирования. Примитивный пример: хранить данные пользователей, чьё имя начинается на буквы A-M на одном сервере, а остальных - на другом. |
157 | 1 | Александр Александров | |
158 | 2 | Александр Александров | h3. По умолчанию, MongoDB пишет и читает данные из primary и secondary наборов реплик. Правда это или ложь? |
159 | |||
160 | Ложь. MongoDB записывает данные только в primary набор реплик. |
||
161 | |||
162 | 1 | Александр Александров | h3. Почему MongoDB не является предпочтительным решением для 32-битных систем? |
163 | |||
164 | 2 | Александр Александров | При работе с 32-разрядной сборкой MongoDB, общий размер хранилища для сервера, включая данные и индексы, составляет 2 гигабайта. По этой причине, не рекомендуеться развертывать MongoDB для продакшина на 32-разрядных машинах. Если вы используете 64-разрядную сборку MongoDB, практически нет никаких ограничений на размер хранилища. |
165 | |||
166 | 1 | Александр Александров | h3. Какая команда,позволяет проверить, являетесь ли вы на главном сервере или нет? |
167 | |||
168 | 2 | Александр Александров | <pre> |
169 | db.isMaster() |
||
170 | </pre> |
||
171 | |||
172 | 1 | Александр Александров | h3. Что такое GridFS? |
173 | |||
174 | 2 | Александр Александров | GridFS - это спецификация, определённая в базе данных MongoDB для хранения и извлечения файлов, размер которых превышает 16 Мб. Такое ограничение размера обусловлено использованием в MongoDB формата BSON. Согласно спецификации GridFS файл разбивается на несколько фрагментов (англ. chunks), каждый из которых не может быть больше, чем 255 Кб. Каждый такой фрагмент хранится как отдельный файл и к нему может быть осуществлён доступ как к отдельному файлу. |
175 | |||
176 | Для обеспечения корректной сборки разбитого на фрагменты файла GridFS хранит коллекцию метаданных - отдельных файлов, содержащих информацию о хранящихся в файловой системе документах. |
||
177 | |||
178 | 1 | Александр Александров | h3. Что такое Map/Reduce? |
179 | |||
180 | 2 | Александр Александров | Map/Reduce - это подход к обработке больших объемов данных, который состоит из двух фаз: Map - предварительная обработка входных данных и Reduce - обработка тем или иным способом выборки, полученной на стадии Map. Map/Reduce не является свойством исключительно NoSQL-решений. Аналогичным образом можно работать с большими объемами данных и в РСУБД. Но большинство NoSQL-систем (за исключением, может быть, самых простых key-value хранилищ) реализуют Map/Reduce в том или ином виде. |
181 | |||
182 | Map/Reduce имеет два серьёзных преимущества по сравнению с традиционными решениями. Первое и самое главное преимущество - это производительность. Теоретически MapReduce может быть распараллелен, что позволяет обрабатывать огромные массивы данных на множестве ядер/процессоров/машин. Это пока не является преимуществом MongoDB. Вторым преимуществом MapReduce является возможность описывать обработку данных нормальным кодом. По сравнению с тем, что можно сделать с помощью SQL, возможности кода внутри MapReduce намного богаче и позволяют расширить рамки возможного даже без использования специализированных решений. |
||
183 | |||
184 | 1 | Александр Александров | h3. Каков создать/удалить коллекцию в MongoDB? |
185 | |||
186 | 2 | Александр Александров | db.createCollection(name,options) - для создания коллекции в MongoDB |
187 | db.collection.drop() - для удаления коллекции в MongoDB |
||
188 | |||
189 | 1 | Александр Александров | h3. Какова роль профайлера в MongoDB? |
190 | |||
191 | 2 | Александр Александров | Профайлера базы данных MongoDB показывает рабочие характеристики каждой операции с базой данных. Для примера вы можете найти запросы с помощью профилировщика которие на самом деле медленнее, чем они должны быть. Профайлер MongoDB можно включить с помощью следующего вызова: db.setProfilingLevel(2); чтобы выключить профайлер, нужно повторно вызвать setProfileLevel, только передав 0 в качестве аргумента. |
192 | |||
193 | 1 | Александр Александров | h3. Какая команда позволяет вставить документ? |
194 | |||
195 | 2 | Александр Александров | database.collection.insert(document) - для вставки документа в колекцию. |
196 | |||
197 | 1 | Александр Александров | h3. Приведите пример использования индекса в MongoDB. |
198 | |||
199 | 2 | Александр Александров | Простой пример: |
200 | |||
201 | <pre> |
||
202 | db.COLLECTION_NAME.ensureIndex({KEY: 1}) |
||
203 | </pre> |
||
204 | |||
205 | 1 | Александр Александров | h3. Какой метод вернёт список всех документов в колекции? |
206 | |||
207 | 2 | Александр Александров | <pre> |
208 | db.unicorns.find() |
||
209 | </pre> |
||
210 | |||
211 | 1 | Александр Александров | h3. Что такое селекторы запросов в MongoDB? |
212 | |||
213 | 2 | Александр Александров | Селектор - это JSON-объект, в простейшем случае это может быть даже {}, что означает выборку всех документов (аналогичным образом работает null). Селектор запросов MongoDB аналогичен предложению where SQL-запроса. Как таковой он используется для поиска, подсчёта, обновления и удаления документов из коллекций. |
214 | |||
215 | 1 | Александр Александров | h3. Что вы знаете об обновлении/вставке в MongoDB? |
216 | |||
217 | 2 | Александр Александров | Один из приятных сюрпризов операции обновления - это возможность обновления/вставки (upsert от update - обновить и insert - вставить) Обновление/вставка обновляет документ, если он найден, или создаёт новый - если не найден. Обновление/вставка - полезная вещь в некоторых случаях; когда столкнётесь с подобным, сразу поймёте. Чтобы разрешить вставку при обновлении, установите третий параметр в true. Пример из жизни - счётчик посещений для веб-сайта. Если мы хотим в реальном времени видеть количество посещений страницы, мы должны посмотреть, существует ли запись, и - в зависимости от результата - выполнить update либо insert. |
218 | |||
219 | 1 | Александр Александров | h3. Что вы знаете об условных оператораторах в MongoDB? |
220 | |||
221 | 2 | Александр Александров | В MongoDB в запросах можно использовать условные: |
222 | |||
223 | * $gt - больше чем |
||
224 | * $lt - меньше чем |
||
225 | * $gte - больше или равно |
||
226 | * $lte - меньше или равно |
||
227 | * $ne - извлекает все документы, не соответствующие некоторому условию |
||
228 | * $or - определяет набор пар ключ-значение, которые должны иметься в документе. И если документ имеет хоть одну такую пару ключ-значение, то он соответствует данному запросу и извлекается из бд |
||
229 | * $size - используется для нахождения документов, в которых массивы имеют число элементов, равным значению $size |
||
230 | * $exists - позволяет извлечь только те документы, в которых определенный ключ присутствует или отсутствует |
||
231 | * $regex - задает регулярное выражение, которому должно соответствовать значение поля |
||
232 | |||
233 | Поиск по массивам и операторы $in, $nin, $all |
||
234 | |||
235 | * $in - определяет массив возможных выражений и ищет те ключи, значение которых имеется в массиве |
||
236 | * $nin - определяет массив возможных выражений и ищет те ключи, значение которых отсутствует в этом массиве |
||
237 | * $all - похож на $in: он также определяет массив возможных выражений, но требует, чтобы документы имели весь определяемый набор выражений |
||
238 | |||
239 | Примеры использования: |
||
240 | |||
241 | {{dmsf_image(367)}} |
||
242 | |||
243 | 1 | Александр Александров | h3. Как удалить документ в MongoDB? |
244 | 2 | Александр Александров | |
245 | Для удаления документов в MongoDB предусмотрен метод remove: |
||
246 | |||
247 | db.users.remove({name: "Tom"}) |
||
248 | |||
249 | В итоге все найденные документы с name=Tom будут удалены. |