129.32K
Category: databasedatabase

Документные базы данных. Часть 2

1.

Документные базы данных
Часть 2

2.

Различия в понятиях
Реляционнная база
MongoDB
схема /база данных
база данных
таблица
коллекция
строка
документ
идентификатор
_id
join
DBRef

3.

Документация
• https://docs.mongodb.com/manual/reference
/database-references/

4.

Вставка данных
db.projects.insert(
{
"name": "my_project_1",
"created": "2022-02-24Т9:00",
"started": "2022-02-24Т9:00",
"ended": null,
"status": "создан",
"tasks": [
{
"_id": ObjectId(),
"task_name": "анализ требований",
"created": "2022-02-24Т9:10",
"started": "2022-02-24Т9:20",
"ended": "2022-03-24Т18:20",
"is_done":false,
"executors":[]
}
]
})
db.projects.find();
{ _id: ObjectId("621796f4e04fb371ebbf032d"),
name: 'my_project_1',
created: '2022-02-24Т9:00',
started: '2022-02-24Т9:00',
ended: null, status: 'создан',
tasks: [ { _id: ObjectId("621796f4e04fb371ebbf032c"),
task_name: 'анализ требований',
created: '2022-02-24Т9:10',
started: '2022-02-24Т9:20',
ended: '2022-03-24Т18:20',
is_done: false,
executors: [] }
]
}

5.

Вставка данных
db.projects.insert(
{ "name": "my_project_11",
"created": Date(),
"started": Date(),
"ended": null,
"status": "создан",
"tasks": [
{ "_id": ObjectId(),
"task_name": "анализ требований",
"created": Date(),
"started": ISODate("2022-02-24"),
"ended": ISODate("2022-03-24"),
"is_done":false,
db.projects.find({ "_id" : ObjectId("62184dac67d60765a42c12e1") })
{ _id: ObjectId("62184dac67d60765a42c12e1"),
"executors":[]
name: 'my_project_11',
}
created: 'Fri Feb 25 2022 06:31:56 GMT+0300 (Москва, стандартное время)',
]
started: 'Fri Feb 25 2022 06:31:56 GMT+0300 (Москва, стандартное время)',
})
ended: null, status: 'создан',
tasks: [ { _id: ObjectId("62184dac67d60765a42c12e0"),
task_name: 'анализ требований',
created: 'Fri Feb 25 2022 06:31:56 GMT+0300 (Москва, стандартное время)',
started: 2022-02-24T00:00:00.000Z,
ended: 2022-03-24T00:00:00.000Z,
is_done: false, executors: [] } ]
}

6.

Вставка в Массивы
• { $push: { <field1>: { <modifier1>: <value1>, ...
}, ... } }
Добавляет множество
$each
значений к полю массива
Ограничивает число
элементов массива, требует
$slice
использование $each
Сортирует элементы массива,
$sort
требует использование $each
Указывает место в
массиве, в которое нужно
вставить новые элементы.
Требуется использование
модификатора $each. Без
модификатора $position
$push добавляет элементы
$position в конец массива.

7.

Вставка в Массивы
• { $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }
• db.students.insertOne( { _id: 1, scores: [ 44, 78, 38, 80 ] } )
• db.students.updateOne(
{ _id: 1 },
{ $push: { scores: 89 } }
)
• db.students.updateOne(
{ name: "joe" },
{ $push: { scores: { $each: [ 90, 92, 85 ] } } }
)

8.

Вставка задания
• db.projects.update({_id:ObjectId("62184dac67d6
0765a42c12e1")},{$push: {
• 'tasks':{_id:ObjectId(), "task_name":
"пользовательский интерфейс",
"created": Date(),
"started": ISODate("2022-03-24"),
"ended": ISODate("2022-04-24"),
"is_done":false,
"executors":[]}}})

9.

Вставка задания
db.projects.find({_id:ObjectId("62184dac67d60765a42c12e1")})
{ _id: ObjectId("62184dac67d60765a42c12e1"),
name: 'my_project_11',
created: 'Fri Feb 25 2022 06:31:56 GMT+0300 (Москва, стандартное время)',
started: 'Fri Feb 25 2022 06:31:56 GMT+0300 (Москва, стандартное время)',
ended: null, status: 'создан',
tasks: [
{ _id: ObjectId("62184dac67d60765a42c12e0"),
task_name: 'анализ требований',
created: 'Fri Feb 25 2022 06:31:56 GMT+0300 (Москва, стандартное время)',
started: 2022-02-24T00:00:00.000Z,
ended: 2022-03-24T00:00:00.000Z,
is_done: false,
executors: [] },
{ _id: ObjectId("621859df67d60765a42c12e3"),
task_name: 'пользовательский интерфейс',
created: 'Fri Feb 25 2022 07:23:59 GMT+0300 (Москва, стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done:
false, executors: [] } ] }

10.

Ручные ссылки
• original_id = ObjectId()
• db.places.insertOne(
• { "_id": original_id, "name": "Broadway Center",
"url": "bc.example.net"})
• db.people.insertOne(
• { "name": "Erin",
• "places_id": original_id,
"url": "bc.example.net/Erin"})

11.

Вставка данных
db.employees.insert(
{"surname":"Иванов",
"name":"Иван",
"patronym":"Иванович" } )
{acknowledged: true, insertedIds: { '0': ObjectId("6218506a67d60765a42c12e2") } }
db.projects.find({ "tasks._id" : ObjectId("621890e606ae8feffc22a50a") })
db.projects.update({"tasks._id":ObjectId("621890e606ae8feffc22a50a")},{$push: {
"tasks.$[].executors":ObjectId("62179acce04fb371ebbf032e")}})
db.projects.find({ "tasks._id" : ObjectId("621890e606ae8feffc22a50a") })
{ _id: ObjectId("621796f4e04fb371ebbf032d"),
name: 'my_project_1',
created: '2022-02-24Т9:00',
started: '2022-02-24Т9:00',
ended: null,
status: 'создан',
tasks: [
{ _id: ObjectId("621796f4e04fb371ebbf032c"),
task_name: 'анализ требований',
created: '2022-02-24Т9:10',
started: '2022-02-24Т9:20',
ended: '2022-03-24Т18:20',
is_done: false,
executors: [ ObjectId("62179acce04fb371ebbf032e") ]
}, { _id:
ObjectId("621890e606ae8feffc22a50a"),
task_name: 'пользовательский интерфейс',
created: 'Fri Feb 25 2022 11:18:46 GMT+0300 (Москва, стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false,
executors: [ ObjectId("62179acce04fb371ebbf032e") ] } ] }

12.

Удаление объекта
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>,
hint: <document|string>
// начиная с версии 4.4
}
)
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)

13.

Параметры
Параметр
Описание
filter
Задает критерии удаления с помощью операторов запроса. Укажите пустой
документ {}, чтобы удалить первый документ, возвращенный в коллекции.
writeConcern
Документ, описывающий уровень «Подтверждения записи»
Подтверждение записи описывает уровень подтверждения, запрашиваемого у
MongoDB для операций записи в автономный mongod, в наборы реплик или в
сегментированные кластеры. В сегментированных кластерах экземпляры
mongos передают подтверждение записи на сегменты.
Если опущено, используется уровень «Подтверждения записи» по умолчанию
Не устанавливайте явно подтверждение записи для операции, если она
выполняется в транзакции.
collation
Задает параметры сортировки, используемые для операции. Сопоставление
позволяет пользователям задавать специфичные для языка правила для
сравнения строк, такие как правила для регистра букв и знаков ударения.
hint
Документ или строка, указывающая индекс, используемый для поддержки
предиката запроса. Опция может принимать документ спецификации индекса
или строку имени индекса. Если вы укажете несуществующий индекс,
произойдет ошибка операции.

14.

collation
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
При указании сортировки поле региональных настроек ( locale) является
обязательным; все остальные поля сопоставления являются
необязательными.
Если параметры сортировки не указаны, но коллекция имеет параметры
сортировки по умолчанию , операция использует параметры сортировки,
указанные для коллекции.
Если для коллекции или операций не указаны параметры сортировки, MongoDB
использует простое двоичное сравнение, которое использовалось в
предыдущих версиях для сравнения строк. Вы не можете указать несколько
параметров сортировки для операции. Например, вы не можете указать
разные параметры сортировки для каждого поля или при выполнении поиска
с сортировкой вы не можете использовать один метод сортировки для
поиска, а другой для сортировки.

15.

Пример с параметром collation
• Колллекция myColl
• { _id: 1, category: "café", status: "A" }
• { _id: 2, category: "cafe", status: "a" }
• { _id: 3, category: "cafE", status: "a" }
• db.myColl.deleteOne(
• { category: "cafe", status: "A" },
• { collation: { locale: "fr", strength: 1 } }
• )

16.

Удаление объекта из коллекции
• db.collection.deleteOne() Начиная с версии 3.2
• db.collection.deleteMany() Начиная с версии 3.2
db.employees.find( { "surname" : { "$not" : /ов$/ } })
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym:
'Петровна' }
{ _id: ObjectId("62277c8c016729fb544906f8"), surname: 'Хренова', name: 'Гадя', patronym:
'Петрович' }
db.employees.deleteOne({_id: ObjectId("62277c8c016729fb544906f8")})
{ acknowledged: true, deletedCount: 1 }

17.

Изменение объекта
• db.collection.findOneAndUpdate(filter, update,
options)
• db.collection.updateOne(filter, update,
options)
• db.collection.updateMany(filter, update,
options)

18.

Изменение объекта
• db.collection.findOneAndUpdate(filter, update, options)
• db.collection.updateOne(filter, update, options)
• db.collection.updateMany(filter, update, options)
db.collection.findOneAndUpdate
( <filter>,
<update document or aggregation pipeline>,
{ projection: <document>,
sort: <document>,
maxTimeMS: <number>,
upsert: <boolean>,
returnNewDocument: <boolean>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
})

19.

findOneAndUpdate
{ _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" :
24 },
{ _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 },
{ _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30
},
{ _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 },
{ _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" :
14 },
{ _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 }
• db.grades.findOneAndUpdate( { "name" : "R. Stiles" },
{ $inc: { "points" : 5 } }
)

20.

Изменение объекта
• db.collection.updateOne(filter, update, options)
• db.collection.updateMany(filter, update, options)
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
// Available starting in MongoDB 4.2.1
}
)
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
// Available starting in MongoDB 4.2.1
}
)

21.

Пример update many
• db.products.insertMany([
{ "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate": ISODate("2011-05-14"), "spec"
: { "ram" : 4, "screen" : 6.5, "cpu" : 2.66 },
"color":["white","black"],
"storage":[64,128,256]},
{ "_id" : 2, "name" : "xTablet", "price" : 899, "releaseDate": ISODate("2011-09-01") , "spec"
: { "ram" : 16, "screen" : 9.5, "cpu" : 3.66 },
"color":["white","black","purple"],
"storage":[128,256,512]},
{ "_id" : 3, "name" : "SmartTablet", "price" : 899, "releaseDate": ISODate("2015-01-14"),
"spec" : { "ram" : 12, "screen" : 9.7, "cpu" : 3.66 },
"color":["blue"],
"storage":[16,64,128]},
{ "_id" : 4, "name" : "SmartPad", "price" : 699, "releaseDate": ISODate("2020-0514"),"spec" : { "ram" : 8, "screen" : 9.7, "cpu" : 1.66 },
"color":["white","orange","gold","gray"],
"storage":[128,256,1024]},
{ "_id" : 5, "name" : "SmartPhone", "price" : 599,"releaseDate": ISODate("2022-09-14"),
"spec" : { "ram" : 4, "screen" : 5.7, "cpu" : 1.66 },
"color":["white","orange","gold","gray"],
"storage":[128,256]} ])
• db.products.updateMany( { price: 899}, { $set: { price: 895 }} )

22.

Логические и арифметические операторы
Оператор
Описание
$regex
Соответствие строки регулярному выражению, совместимому с синтаксисом PCRE
$ne
Не равно
$lt
Меньше
$lte
Меньше или равно
$gt
Больше
$gte
Больше или равно
$exists
Проверяет существование поля
$all
Соответствие всем элементам массива
$in
Соответствие хотя бы одному элементу массива
$nin
Несоответствие ни одному элементу массива
$elemMatch
Соответствие всех полей вложенного документа
$or
Или
$nor
соединяет 2 условия, и документ должен НЕ соответствовать обоим
$size
Соответствие размеру массива
$mod
Деление по модулю
$type
Соответствие, если поле имеет указанный тип
$not
Отрицание

23.

Логические и арифметические
операторы
• { field: { $gte: value } }
• { _id: 1, results: [ 82, 85, 88 ] }
• { _id: 2, results: [ 75, 88, 89 ] }
• db.scores.find(
{ results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)
• { "_id" : 1, "results" : [ 82, 85, 88 ] }

24.

Операторы для работы с массивами
Команда
Описание
$pop
Удаляет последний (или первый)
элемент из массива
$push
Помещает новый элемент в массив
$pushAll
Помещает все указанные элементы в
массив
$addToSet
Аналогичен push, но дубликаты не
добавляются
$pull
Удаляет из массива подходящее
значение, если оно в
нем есть
$pullAll
Удаляет из массива все подходящие
значения

25.

Операторы для изменения данных
Команда
Описание
$set
Записывает указанное значение в указанное поле
$unset
Удаляет поле
$inc
Прибавляет указанное число к указанному полю

26.

Операторы для изменения данных
db.projects.find({"_id":ObjectId("622a362cd0013f2265896fdc")})
{ _id: ObjectId("622a362cd0013f2265896fdc"),
name: 'my_project_1',
created: 'Thu Mar 10 2022 20:32:28 GMT+0300 (Москва, стандартное время)',
started: 'Thu Mar 10 2022 20:32:28 GMT+0300 (Москва, стандартное время)',
ended: null,
status: 'в работе',
pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"), ObjectId("6229f5b9d35e8755fcf68e39"),
ObjectId("6229f718d35e8755fcf68e3c") ],
workers: [],
task_auth: [] }
db.projects.updateOne({"_id":ObjectId("622a362cd0013f2265896fdc")},
[ {$set:{"name":"our_project_1","comments":"some comment"} },
{ $unset: [ "workers" ] }])
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
db.projects.find({"_id":ObjectId("622a362cd0013f2265896fdc")})
{ _id: ObjectId("622a362cd0013f2265896fdc"),
name: 'our_project_1',
created: 'Thu Mar 10 2022 20:32:28 GMT+0300 (Москва, стандартное время)',
started: 'Thu Mar 10 2022 20:32:28 GMT+0300 (Москва, стандартное время)',
ended: null,
status: 'в работе',
pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"), ObjectId("6229f5b9d35e8755fcf68e39"),
ObjectId("6229f718d35e8755fcf68e3c") ],
task_auth: [],
comments: 'some comment' }

27.

Поисковые запросы
• db.collection.find(query, projection)
Параметр Описание
query
Необязательный. Задает фильтр выбора с помощью операторов
запроса. Чтобы вернуть все документы в коллекции, опустите этот
параметр или передайте пустой документ ({}).
projection
Необязательный. Указывает поля, которые должны возвращаться
в документах, соответствующих фильтру запроса. Чтобы вернуть
все поля в соответствующих документах, опустите этот параметр. {
<field1>: <value>, <field2>: <value> ... }

28.

db.collection.aggregate()
• db.collection.aggregate(pipeline, options)
Pipeline(пайплайн) - это
последовательность стадий (они же stages),
внутри которых расположены задачи (jobs).
Расположены они таким образом, что
выход каждого элемента является входом
следующего, т.е. новый функционал по
очереди оказывается в руках разных
команд, по аналогии с физическим
конвейером.

29.

Этапы
Stage (этап)
Описание
$addFields
Добавляет новые поля в документы. Подобно $project, $addFields изменяет форму каждого
документа в потоке; в частности, путем добавления новых полей в выходные документы,
которые содержат как существующие поля из входных документов, так и вновь
добавленные поля. $set псевоним для $addFields.
$collStats
Возвращает статистику по коллекции или представлению.
$count
Возвращает количество документов на данном этапе конвейера агрегации.
$facet
$graphLookup
$group
$limit
$lookup
Обрабатывает несколько конвейеров агрегации на одном этапе с одним и тем же набором
входных документов. Позволяет создавать многогранные агрегаты, способные
характеризовать данные по нескольким измерениям или аспектам за один этап.
Выполняет рекурсивный поиск в коллекции. К каждому выходному документу добавляет
новое поле массива, содержащее результаты обхода рекурсивного поиска для этого
документа.
Группирует входные документы по указанному выражению-идентификатору и применяет
выражения-аккумуляторы, если они указаны, к каждой группе. Использует все входные
документы и выводит по одному документу для каждой отдельной группы. Выходные
документы содержат только поле идентификатора и, если указано, накопленные поля.
Передает первые n документов без изменений в конвейер, где n — указанное
ограничение. Для каждого входного документа выводит либо один документ (для первых
n документов), либо ноль документов (после первых n документов)
Выполняет левое внешнее соединение с другой коллекцией в той же базе данных для
фильтрации документов из «соединенной» коллекции для обработки.

30.

Этапы
Stage (этап)
$lookup
$match
$merge
$out
$project
$replaceRoot
Описание
Выполняет левое внешнее соединение с другой коллекцией в той же базе данных для
фильтрации документов из «соединенной» коллекции для обработки.
Фильтрует поток документов, позволяя только совпадающим документам передаваться
без изменений на следующий этап конвейера. $match использует стандартные запросы
MongoDB. Для каждого входного документа выводит либо один документ (совпадение),
либо ноль документов (нет совпадения).
Записывает результирующие документы конвейера агрегации в коллекцию. Этап может
включать (вставлять новые документы, объединять документы, заменять документы,
сохранять существующие документы, завершать операцию с ошибкой, обрабатывать
документы с помощью настраиваемого конвейера обновления) результаты в выходную
коллекцию. Чтобы использовать стадию $merge, она должна быть последней стадией
конвейера.
Записывает результирующие документы конвейера агрегации в коллекцию. Чтобы
использовать стадию $out, она должна быть последней стадией конвейера.
Изменяет форму каждого документа в потоке, например, добавляя новые поля или удаляя
существующие поля. Для каждого входного документа выводит один документ.
Заменяет документ указанным внедренным документом. Операция заменяет все
существующие поля во входном документе, включая поле _id. Укажите документ,
внедренный во входной документ, чтобы повысить уровень встроенного документа до
верхнего уровня.
$replaceWith -псевдоним

31.

Этапы
Stage (этап)
Описание
$setWindowFiel Группирует документы в окна и применяет один или несколько операторов к документам в
ds
каждом окне
Пропускает первые n документов, где n — заданный номер пропуска, и передает
остальные документы без изменений в конвейер. Для каждого входного документа
$skip
выводит либо ноль документов (для первых n документов), либо один документ (если
после первых n документов).
Переупорядочивает поток документов по указанному ключу сортировки. Меняется только
$sort
порядок; документы остаются без изменений. Для каждого входного документа выводит
один документ.
Группирует входящие документы на основе значения указанного выражения, а затем
$sortByCount
вычисляет количество документов в каждой отдельной группе
Выполняет объединение двух коллекций; то есть объединяет результаты конвейера из
$unionWith
двух коллекций в один набор результатов.
Деконструирует поле массива из входных документов, чтобы вывести документ для
каждого элемента. Каждый выходной документ заменяет массив значением элемента. Для
$unwind
каждого входного документа выводит n документов, где n — количество элементов
массива и может быть равно нулю для пустого массива.

32.

Поиск подстроки
Описание
код
В любом месте строки
/текст/
В начале строки
/^текст/
В конце строки
/текст$/
db.employees.find()
{ _id: ObjectId("6218506a67d60765a42c12e2"), surname: 'Иванов', name: 'Иван', patronym: 'Иванович'
}
{ _id: ObjectId("622668df03f1ba1e55db7452"), surname: 'Петров', name: 'Петр', patronym: 'Петрович' }
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym: 'Петровна' }
db.employees.find({surname:/ов/})
{ _id: ObjectId("6218506a67d60765a42c12e2"), surname: 'Иванов', name: 'Иван', patronym: 'Иванович'
}
{ _id: ObjectId("622668df03f1ba1e55db7452"), surname: 'Петров', name: 'Петр', patronym: 'Петрович' }
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym: 'Петровна' }
db.employees.find({surname:/^Иван/})
{ _id: ObjectId("6218506a67d60765a42c12e2"), surname: 'Иванов', name: 'Иван', patronym: 'Иванович'
}
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym: 'Петровна' }
db.employees.find({surname:/ов$/})
{ _id: ObjectId("6218506a67d60765a42c12e2"), surname: 'Иванов', name: 'Иван', patronym: 'Иванович'
}
{ _id: ObjectId("622668df03f1ba1e55db7452"), surname: 'Петров', name: 'Петр', patronym: 'Петрович'

33.

Поиск подстроки/ Несколько
условий
db.employees.find( )
{ _id: ObjectId("6218506a67d60765a42c12e2"), surname: 'Иванов', name: 'Иван', patronym:
'Иванович' }
{ _id: ObjectId("622668df03f1ba1e55db7452"), surname: 'Петров', name: 'Петр', patronym:
'Петрович' }
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym:
'Петровна' }
{ _id: ObjectId("62277f50016729fb544906f9"), surname: 'Менделеева', name: 'Любовь', patronym:
'Дмитриевна' }
db.employees.find( { "surname" : { "$not" : /ов$/ } })
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym:
'Петровна' }
{ _id: ObjectId("62277f50016729fb544906f9"), surname: 'Менделеева', name: 'Любовь', patronym:
'Дмитриевна' }
db.employees.find({$and:[{surname:/ов/},{ "surname" : { "$not" : /ов$/ } }]})
{ _id: ObjectId("622668df03f1ba1e55db7453"), surname: 'Иванова', name: 'Анна', patronym:
'Петровна' }

34.

Соединение коллекций
• {
• $lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of
the "from" collection>,
as: <output array field>
}
• }

35.

Проекты
db.projects.find();
{ _id: ObjectId("622a0482d35e8755fcf68e40"),
name: 'my_project_1',
created: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва, стандартное время)',
started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва, стандартное время)',
ended: null, status: 'в работе',
pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"), ObjectId("6229f5b9d35e8755fcf68e39"),
ObjectId("6229f718d35e8755fcf68e3c") ],
workers: [], task_auth: [] }
{ _id: ObjectId("622a0482d35e8755fcf68e41"),
name: 'my_project_2', created: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва, стандартное
время)1',
started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва, стандартное время)1',
ended: null, status: 'создан', pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"),
ObjectId("6229f5bad35e8755fcf68e3b") ],
workers: [], task_auth: [] }
{ _id: ObjectId("622a0482d35e8755fcf68e42"), name: 'my_project_3',
created: 2022-05-24T00:00:00.000Z, started: 2022-06-24T00:00:00.000Z, ended: null, status:
'создан',
pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3b") ], workers: [], task_auth: [] }

36.

Соединение коллекций пример
db.projects.aggregate( { $lookup: { from: "tasks", localField: "pr_tasks", foreignField: "_id", as: "project_tasks" } } )
{ _id: ObjectId("622a0482d35e8755fcf68e40"), name: 'my_project_1', created: 'Thu Mar 10 2022 17:00:34
GMT+0300 (Москва, стандартное время)', started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва,
стандартное время)', ended: null, status: 'в работе', pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"),
ObjectId("6229f5b9d35e8755fcf68e39"), ObjectId("6229f718d35e8755fcf68e3c") ], workers: [], task_auth: [],
project_tasks: [ { _id: ObjectId("6229f5b9d35e8755fcf68e39"), task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва, стандартное время)', started: 2022-0324T00:00:00.000Z, ended: 2022-04-24T00:00:00.000Z, is_done: false }, { _id:
ObjectId("6229f5bad35e8755fcf68e3a"), task_name: 'интерграция проектов 1 и 2', created: 'Thu Mar 10 2022
15:57:30 GMT+0300 (Москва, стандартное время)', started: 2022-03-24T00:00:00.000Z, ended: 2022-0424T00:00:00.000Z, is_done: true }, { _id: ObjectId("6229f718d35e8755fcf68e3c"), task_name: 'работа с бд',
created: 'Thu Mar 10 2022 16:03:20 GMT+0300 (Москва, стандартное время)', started: 2022-0224T00:00:00.000Z, ended: 2022-03-24T00:00:00.000Z, is_done: false } ] }
{ _id: ObjectId("622a0482d35e8755fcf68e41"), name: 'my_project_2', created: 'Thu Mar 10 2022 17:00:34
GMT+0300 (Москва, стандартное время)1', started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва,
стандартное время)1', ended: null, status: 'создан', pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"),
ObjectId("6229f5bad35e8755fcf68e3b") ], workers: [], task_auth: [], project_tasks: [ { _id:
ObjectId("6229f5bad35e8755fcf68e3a"), task_name: 'интерграция проектов 1 и 2', created: 'Thu Mar 10 2022
15:57:30 GMT+0300 (Москва, стандартное время)', started: 2022-03-24T00:00:00.000Z, ended: 2022-0424T00:00:00.000Z, is_done: true }, { _id: ObjectId("6229f5bad35e8755fcf68e3b"), task_name: 'полная
интерграция проектов 2 и 3', created: 'Thu Mar 10 2022 15:57:30 GMT+0300 (Москва, стандартное время)',
started: 2022-05-24T00:00:00.000Z, ended: 2022-05-31T00:00:00.000Z, is_done: false } ] }
{ _id: ObjectId("622a0482d35e8755fcf68e42"), name: 'my_project_3', created: 2022-05-24T00:00:00.000Z,
started: 2022-06-24T00:00:00.000Z, ended: null, status: 'создан', pr_tasks: [
ObjectId("6229f5bad35e8755fcf68e3b") ], workers: [], task_auth: [], project_tasks: [ { _id:
ObjectId("6229f5bad35e8755fcf68e3b"), task_name: 'полная интерграция проектов 2 и 3', created: 'Thu Mar 10
2022 15:57:30 GMT+0300 (Москва, стандартное время)', started: 2022-05-24T00:00:00.000Z, ended: 2022-05-

37.

Соединение коллекций пример
db.tasks.aggregate( { $lookup: { from: "projects", localField: "_id", foreignField: "pr_tasks", as: "project_tasks" } }
)
{ _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва, стандартное время)', started: 2022-0324T00:00:00.000Z, ended: 2022-04-24T00:00:00.000Z, is_done: false,
project_tasks:
[ { _id: ObjectId("622a0482d35e8755fcf68e40"), name: 'my_project_1', created: 'Thu Mar 10 2022 17:00:34
GMT+0300 (Москва, стандартное время)', started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва,
стандартное время)', ended: null, status: 'в работе',
pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"), ObjectId("6229f5b9d35e8755fcf68e39"),
ObjectId("6229f718d35e8755fcf68e3c") ],
workers: [], task_auth: [] }
]}
{ _id: ObjectId("6229f5bad35e8755fcf68e3a"), task_name: 'интерграция проектов 1 и 2', created: 'Thu Mar 10
2022 15:57:30 GMT+0300 (Москва, стандартное время)', started: 2022-03-24T00:00:00.000Z, ended: 202204-24T00:00:00.000Z, is_done: true,
project_tasks:
[ { _id: ObjectId("622a0482d35e8755fcf68e40"), name: 'my_project_1', created: 'Thu Mar 10 2022 17:00:34
GMT+0300 (Москва, стандартное время)', started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва,
стандартное время)', ended: null, status: 'в работе', pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"),
ObjectId("6229f5b9d35e8755fcf68e39"), ObjectId("6229f718d35e8755fcf68e3c") ], workers: [], task_auth: [] }
, { _id: ObjectId("622a0482d35e8755fcf68e41"), name: 'my_project_2', created: 'Thu Mar 10 2022 17:00:34
GMT+0300 (Москва, стандартное время)1', started: 'Thu Mar 10 2022 17:00:34 GMT+0300 (Москва,
стандартное время)1', ended: null, status: 'создан', pr_tasks: [ ObjectId("6229f5bad35e8755fcf68e3a"),

38.

• Задача, относящаяся к 2 различным
проектам
• Задача с самым поздним сроком окончания
• Проект с самым большим количеством
задач
• Человек, у которого нет незавершенных
задач

39.

Промежуточная агрегация
db.tasks.aggregate([
{
$lookup: { from: "projects", localField: "_id",
foreignField: "pr_tasks",
as: "project_tasks" }
},
{$project:{"_id":1,"task_name":1,"num_proj":{$size:"$project_tasks"}} }
])
{ _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
num_proj: 1 }
{ _id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_name: 'интерграция проектов 1 и 2',
num_proj: 2 }
{ _id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_name: 'полная интерграция проектов 2 и 3',
num_proj: 2 }
{ _id: ObjectId("6229f718d35e8755fcf68e3c"),
task_name: 'работа с бд',
num_proj: 1 }

40.

Задача, относящаяся к 2 различным
проектам
db.tasks.aggregate([
{
$lookup:
{
from: "projects",
localField: "_id",
foreignField: "pr_tasks",
as: "project_tasks"
} },
{$project:{"_id":1,"task_name":1,"num_proj":{$size:"$project_tasks"}}
},
{$match:{"num_proj":{ $gte: 2 }} }
])
{ _id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_name: 'интерграция проектов 1 и 2', num_proj: 2 }
{ _id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_name: 'полная интерграция проектов 2 и 3', num_proj: 2 }

41.

Максимальное количество проектов
у задания
db.tasks.aggregate([
{
$lookup:
{
from: "projects",
localField: "_id",
foreignField: "pr_tasks",
as: "project_tasks"
} },
{$project:{"_id":1,"task_name":1,"num_proj":{$size:"$project_tasks"}}
},
{$group:{
_id:null,
maxproj_count: { $max: "$num_proj" }
}
}
])
{ _id: null, maxproj_count: 2

42.

Задачи с максимальным количеством проектов
db.tasks.aggregate([
{
$lookup:
{
from: "projects",
localField: "_id",
foreignField: "pr_tasks",
as: "project_tasks"
} },
{$project:{"_id":1,"task_name":1,"num_proj":{$size:"$project_tasks"}}
},
{$group:{
_id:null,
maxproj_count: { $max: "$num_proj" },
"task_data": { "$push": "$$ROOT" }
}
},
{ $unwind : "$task_data" },
{$project:{"_id":"$task_data._id","task_nm":"$task_data.task_name","num":"$task_data.num_proj",maxproj_
count:1 ,"is_eq":{$eq:["$task_data.num_proj","$maxproj_count"]}}
},
{$match:{"is_eq":true}}
])
{ maxproj_count: 2, _id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_nm: 'интерграция проектов 1 и 2', num: 2, is_eq: true }
{ maxproj_count: 2, _id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_nm: 'полная интерграция проектов 2 и 3', num: 2, is_eq: true }
English     Русский Rules