1) К какому типу баз данных принадлежит MongoDB?

MongoDB - это документно-ориентированная NoSQL база данных. Она не требует схемы данных, а также поддерживает sharding и репликацию из коробки.

2) Где и в каком формате Mongo хранит документы?

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

3) Как создать индекс MongoDB?

Чтобы создать индекс, используйте следующую команду базы данных: db.collection.createIndex (keys, options). Первый аргумент - это объект с полями, для которых вам нужно создать индекс, второй аргумент должен содержать набор опций, которые управляют созданием индекса.
db.orders.createIndex({ amount: 1, createdAt: 1, category: 1 },{})

4) Поддержывает ли MongoDB транзакции?

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

5) Что такое WiredTiger и MMAPv1?

WiredTiger и MMAPv1 - это движоки хранения даных, которые MongoDB использует под капотом. До версии 3.2 MMAPv1 был движком по умолчанию, чтобы обеспечить устойчивость, он записывает информацию обо всех обновлениях данных в журнал. WiredTiger поддерживает также ведение журнала, но у него есть некоторые другие методы, обеспечивающие устойчивость и последовательность: моментальные снимки и контрольные точки. Существует возможность отключить журнал, поскольку MongoDB может восстановиться с последней контрольной точки. Однако это не рекомендованая практика, потому что изменения после последней контрольной точки не могут быть восстановлены.

6) Как отключить журналирование?

Начиная с MongoDB версии 4.0 вы можете указать параметр --nojournal или storage.journal.enabled: false для инстанса mongo, использующих механизм хранения WiredTiger.

7) Как подсчитать количество уникальных значений для поля/ключа ?

Для такого случая MongoDB имеет специальную команду distinct, которая возвращает массив уникальных  значений для поля. Чтобы получить количество, просто извлеките длину массива.
> db.users.distinct('langauge');
[ "en", "ru", "uk", "de" ]

8) Как эффективно реализовать пагинацию в MongoDB ?

Существует два подхода: использование skip() и limit() или find() и limit(). Команда skip() принимает в качестве аргумента число первых n документов, которые необходимо пропустить. limit () отвечает за количество возвращаемых документов.

db.users.find().skip(10).limit(20) //Getting second page

Второй подход заключается в том, чтобы использовать команду find() для запроса определенных документов, например документов, в которых _id поле меньше, чем _id  последнего документу на предыдущей странице.
db.users.find().limit(10);last_id = ...
db.users.find({'_id'> last_id}). limit(10);

9) Что такое конвейер агрегации (aggregation pipeline)?
 

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

10) Как сортировать документы?

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

db.users.find({first_name:"John"}).sort( { age: -1 } )

11) Как отсортировать по полю типа массив в MongoDB?

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

db.employees.aggregate(
    { $match: {
        _id : 1
    }}, 
    { $unwind: '$bonuses' },
    { $match: {
        'bonuses.type': 'annual'
    }},
    { $sort: {
        'bonuses.amount': -1
    }})

12) Как узнать размер колекции?

Чтобы получить размер коллекции MongoDB, используйте db.collection.stats (). Этот метод возвращает статистику о вашей коллекции: количество документов в коллекции, размер коллекции, размер индекса. Он принимает необязательный параметр «scale», который определяет единицы вывода для данных размера, по умолчанию он отображается в байтах.

db.logs.stats(1024*1024);

13) Что такое курсор?

Курсор - это указатель на набор документов, возвращаемый функцией db.collection.find (). Курсор имеет различные полезные методы, такие как cursor.hasNext(),cursor.count(),cursor.explain().
var users = db.users.find( { age : { $gt:18 }});while(users.hasNext()){print(tojson(users.next()));}

14) Существует ли ограничение на размер документа?

Mongo хранит документы в формате BSON, максимальный размер документа BSON - 16 мегабайт.

15) Существует ли ограничение на количество индексов на коллекцию?

Одна коллекция может содержать не более 64 индексов. Если вам нужно больше индексов, вам следует рассмотреть возможность разделения вашей коллекции.

16) Что  такое capped коллекция? Как создать capped коллекцию?

Capped коллекция представляет собой коллекцию с фиксированным размером, она поддерживает высокопроизводительные операции, вставки и извлечения документов на основе порядка создания. Если вы достигнете максимального размера коллекции, то первые документы будут удалены. Также  сapped  коллекции гарантируют сохранение порядка вставки. Чтобы создать ограниченную коллекцию, используйте следующий синтаксис:
db.createCollection("logs", { capped: true,
                              size: 1024*1024*1024,
                              max:10000})

17) Как удалить документ из коллекции?
 
Ниже приведены методы для документов удаления: 
db.collection.deleteMany () и db.collection.deleteOne (). Первая команда удаляет все документы, которые фильтр из коллекции, второй удаляет первый согласованный документ.
db.users.deleteMany({createdAt:{$gte:twoWeeksAgo},emailConfirmed:false})

18) Что такое sharding и репликация в MongoDB?
 
Sharding - это метод распределения базы данных на нескольких серверах. Он должен использоваться для больших наборов данных, которые не вмещаются на одной машине. Репликация - это когда тот же набор данных  хранится в нескольких местах. Набор реплик MongoDB обеспечивает избыточность и высокую доступность и рекомендуется использовать для production окружения. Набор реплик представляет собой группу экземпляров mongod, которые имеют одинаковые наборы данных. Существует первичный узел, который получает все операции записи, другие узлы выполняют только операции чтения.

19) Как включить аутентификацию по паролю?
 

Первый шаг - создать администратора
db.createUser(
  {
    user: "admin",
    pwd: "super_secretPassword",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  })

Затем перезапустите MongoDB с аргументом --auth

mongod --auth --port 27017 --dbpath /data/mydb


20) Что такое Map-Reduce и как его использовать?

Map-Reduce - это модель программирования, которая позволяет одновременно выполнять задачи на многих распределенных компьютерах. MongoDB предоставляет встроенную команду mapReduce. Map-Reduce выполняется в две фазы: 
map - принимает документы и возвращает пары ключ-значение
reduce - собирает и формирует результат.
> var map = function() {emit(this.movie_id,this.rating);};
> var reduce = function(movie_id,ratings) {return Array.sum(ratings);};
> db.MovieRatings.mapReduce({
    "result" : "totals",
    "timeMillis" : 599,
    "counts" : {
        "input" : 9,
        "emit" : 9,
        "reduce" : 3,
        "output" : 3
    },
    "ok" : 1}

21) Что такое GridFS?

GridFS - это соглашение для сохранения файлов размером более 16 МБ. Все официальные драйверы MongoDB поддерживают это соглашение, как и программа mongofiles.

22) Что такое ObjectId и как он генерируется?

ObjectId - это 12-байтовый тип BSON, который используется для уникальной идентификации документов внутри коллекции. Он создается на основе текущей метки времени, идентификатора машины, идентификатора процесса и локального счетчика. По умолчанию MongoDB использует ObjectId для установки поля document_id.
> ObjectId()
ObjectId("5baba06c2a61fbb201c19d82")

23) На какой структуре данных основаны индексы MongoDB?

Индексы MongoDB основаны на B-деревьях. B-дерево - это тип сбалансированного дерева, который обеспечивает эффективное хранение и поиск данных.

24) Как искать по полю массива?

Для запроса коллекции в полю массива используйте следующий синтаксис:
db.post.find( { tags: ["nosql", "nosql"] } ) // Find all documents which has tags field consist of "nosql" and "mongo" in specified order.


Если порядок не важен используйте оператор $all:
db.post.find( { tags: { $all: ["nosql", "nosql"] } } )

25) Как проверить, существует ли коллекция в Mongodb?

В консоли mongo выполните следующую команду
use mydb;
db.runCommand( { listCollections: 1 } );