109.77K
Category: programmingprogramming

Программирование. Лабораторная работа №12

1.

Лабораторная 12

2.

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

3.

Задачи данные
db.tasks.find()
{ _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва, стандартное время)',
started: 2022-03-24T00: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-04-24T00: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("6229f718d35e8755fcf68e3c"),
task_name: 'работа с бд',
created: 'Thu Mar 10 2022 16:03:20 GMT+0300 (Москва, стандартное время)',
started: 2022-02-24T00:00:00.000Z, ended: 2022-03-24T00:00:00.000Z, is_done: false }
• Задачи, в названии которых содержится слово «интеграция», но оно

4.

Задачи, в названии которых содержится
слово «интеграция», но оно не последнее
db.tasks.find({$and:[{"task_name":/интеграция/},{ "task_name" : { "$not" : /интеграция$/ } }]})
{ _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-04-24T00: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 }

5.

Задача, относящаяся к 2 различным проектам
• По шагам
1. Основа- Задача
2. Присоединить проекты
3. Создать поле с количеством проектов
4. Выбрать те задачи, у которых поле с количеством проектов>=2

6.

Задача, относящаяся к 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 }}
}
]
)
},

7.

Задача, относящаяся к 2 различным проектам
{ _id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_name: 'интеграция проектов 1 и 2',
num_proj: 2 }
{ _id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_name: 'полная интеграция проектов 2 и 3',
num_proj: 2 }

8.

Задача с самым поздним сроком
окончания
• Основа- Задача

9.

Максимальный срок
• db.tasks.aggregate([
• {$project:{"_id":1,"task_name":1,"ended":1}
• },
• {$group:{
_id:null,
• max_end: { $max: "$ended" },
• "task_data": { "$push": "$$ROOT" }
• }
• }
• ])

10.

Максимальный срок
{ _id: null,
{ _id: null,
max_end: 2022-05-31T00:00:00.000Z,
task_data:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
ended: 2022-04-24T00:00:00.000Z },
{ _id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_name: 'интеграция проектов 1 и 2',
ended: 2022-04-24T00:00:00.000Z },
{ _id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_name: 'полная интеграция проектов 2 и 3',
ended: 2022-05-31T00:00:00.000Z },
{ _id: ObjectId("6229f718d35e8755fcf68e3c"),
task_name: 'работа с бд',
ended: 2022-03-24T00:00:00.000Z } ] }

11.

Добавляем возможность сравнения
db.tasks.aggregate([
{$project:{"_id":1,"task_name":1,"ended":1}
},
{$group:{
_id:null,
max_end: { $max: "$ended" },
"task_data": { "$push": "$$ROOT" }
}
},
{ $unwind : "$task_data" }
])

12.

Добавляем возможность сравнения
{ _id: null,
{ _id: null,
max_end: 2022-05-31T00:00:00.000Z,
max_end: 2022-05-31T00:00:00.000Z,
task_data:
task_data:
{ _id: ObjectId("6229f5b9d35e8755fcf68e39"),
{ _id: ObjectId("6229f718d35e8755fcf68e3c"),
task_name: 'пользовательский интерфейс',
task_name: 'работа с бд',
ended: 2022-04-24T00:00:00.000Z } }
ended: 2022-03-24T00:00:00.000Z } }
{ _id: null,
max_end: 2022-05-31T00:00:00.000Z,
task_data:
{ _id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_name: 'интеграция проектов 1 и 2',
ended: 2022-04-24T00:00:00.000Z } }
{ _id: null,
max_end: 2022-05-31T00:00:00.000Z,
task_data:
{ _id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_name: 'полная интеграция проектов 2 и 3',
ended: 2022-05-31T00:00:00.000Z } }

13.

Добавляем поле равенства
db.tasks.aggregate([
{$project:{"_id":1,"task_name":1,"ended":1}
},
{$group:{
_id:null,
max_end: { $max: "$ended" },
"task_data": { "$push": "$$ROOT" }
}
},
{ $unwind : "$task_data" },
{
$project:{"_id":"$task_data._id","task_nm":"$task_data.task_name","num":"$task_data.num_proj",max_end:1
,"is_eq":{$eq:["$task_data.ended","$max_end"]}}
}
])

14.

Добавляем поле равенства
{ max_end: 2022-05-31T00:00:00.000Z,
_id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_nm: 'пользовательский интерфейс',
is_eq: false }
{ max_end: 2022-05-31T00:00:00.000Z,
_id: ObjectId("6229f5bad35e8755fcf68e3a"),
task_nm: 'интеграция проектов 1 и 2',
is_eq: false }
{ max_end: 2022-05-31T00:00:00.000Z,
_id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_nm: 'полная интеграция проектов 2 и 3',
is_eq: true }
{ max_end: 2022-05-31T00:00:00.000Z,
_id: ObjectId("6229f718d35e8755fcf68e3c"),
task_nm: 'работа с бд',
is_eq: false }

15.

Задача с самым поздним сроком окончания
db.tasks.aggregate([
{$project:{"_id":1,"task_name":1,"ended":1}
},
{$group:{
_id:null,
max_end: { $max: "$ended" },
"task_data": { "$push": "$$ROOT" }
}
},
{ $unwind : "$task_data" },
{
$project:{"_id":"$task_data._id","task_nm":"$task_data.task_name","num":"$task_data.num_proj",max_end:1
,"is_eq":{$eq:["$task_data.ended","$max_end"]}}
},
{$match:{"is_eq":true}}
])

16.

Задача с самым поздним сроком
окончания
{ max_end: 2022-05-31T00:00:00.000Z,
_id: ObjectId("6229f5bad35e8755fcf68e3b"),
task_nm: 'полная интеграция проектов 2 и 3',
is_eq: true }

17.

Проект с самым большим количеством
задач

18.

Получаем количество задач
• db.projects.aggregate([
• {$project:{"_id":1,"name":1,"num_task":{$size:"$pr_tasks"}}
•}
• ])

19.

Получаем количество задач
{ _id: ObjectId("622a0482d35e8755fcf68e40"),
name: 'my_project_1',
num_task: 3 }
{ _id: ObjectId("622a0482d35e8755fcf68e41"),
name: 'my_project_2',
num_task: 2 }
{ _id: ObjectId("622a0482d35e8755fcf68e42"),
name: 'my_project_3',
num_task: 1 }

20.

Ищем максимальное количество
• db.projects.aggregate([
• {$project:{"_id":1,"name":1,"num_task":{$size:"$pr_tasks"}}
• },
• {$group:{
_id:null,
• max_task_c: { $max: "$num_task" },
• "task_data": { "$push": "$$ROOT" }
• }}
• ])

21.

Ищем максимальное количество
{ _id: null,
max_task_c: 3,
task_data:
[ { _id: ObjectId("622a0482d35e8755fcf68e40"),
name: 'my_project_1',
num_task: 3 },
{ _id: ObjectId("622a0482d35e8755fcf68e41"),
name: 'my_project_2',
num_task: 2 },
{ _id: ObjectId("622a0482d35e8755fcf68e42"),
name: 'my_project_3',
num_task: 1 } ] }

22.

Приводим к одному уровню
• db.projects.aggregate([
• {$project:{"_id":1,"name":1,"num_task":{$size:"$pr_tasks"}}
• },
• {$group:{
_id:null,
• max_task_c: { $max: "$num_task" },
• "task_data": { "$push": "$$ROOT" }
• }},
• { $unwind : "$task_data" }
• ])

23.

Приводим к одному уровню
{ _id: null,
max_task_c: 3,
task_data:
{ _id: ObjectId("622a0482d35e8755fcf68e40"),
name: 'my_project_1',
num_task: 3 } }
{ _id: null,
max_task_c: 3,
task_data:
{ _id: ObjectId("622a0482d35e8755fcf68e41"),
name: 'my_project_2',
num_task: 2 } }
{ _id: null,
max_task_c: 3,
task_data:
{ _id: ObjectId("622a0482d35e8755fcf68e42"),
name: 'my_project_3',
num_task: 1 } }

24.

Создаем поле с равенством
db.projects.aggregate([
{$project:{"_id":1,"name":1,"num_task":{$size:"$pr_tasks"}}
},
{$group:{
_id:null,
max_task_c: { $max: "$num_task" },
"task_data": { "$push": "$$ROOT" }
}},
{ $unwind : "$task_data" },
{
$project:{"_id":"$task_data._id","project_nm":"$task_data.name","num_task1":"$task_data.num_task",max_t
ask_c:1 ,"is_eq":{$eq:["$task_data.num_task","$max_task_c"]}}
}
])

25.

Создаем поле с равенством
{ max_task_c: 3,
_id: ObjectId("622a0482d35e8755fcf68e40"),
project_nm: 'my_project_1',
num_task1: 3,
is_eq: true }
{ max_task_c: 3,
_id: ObjectId("622a0482d35e8755fcf68e41"),
project_nm: 'my_project_2',
num_task1: 2,
is_eq: false }
{ max_task_c: 3,
_id: ObjectId("622a0482d35e8755fcf68e42"),
project_nm: 'my_project_3',
num_task1: 1,
is_eq: false }

26.

Проект с самым большим количеством
задач
db.projects.aggregate([
{$project:{"_id":1,"name":1,"num_task":{$size:"$pr_tasks"}}
},
{$group:{
_id:null,
max_task_c: { $max: "$num_task" },
"task_data": { "$push": "$$ROOT" }
}},
{ $unwind : "$task_data" },
{
$project:{"_id":"$task_data._id","project_nm":"$task_data.name","num_task1":"$task_data.num_task",max_task_c:1
,"is_eq":{$eq:["$task_data.num_task","$max_task_c"]}}
},
{$match:{"is_eq":true}}
])

27.

Проект с самым большим количеством
задач
{ max_task_c: 3,
_id: ObjectId("622a0482d35e8755fcf68e40"),
project_nm: 'my_project_1',
num_task1: 3,
is_eq: true }

28.

Человек, у которого нет незавершенных
задач
• По шагам
1. Основа- человек
2. Присоединить задачи
3. Оставить в объекте, полученном присоединением только
незавершенные задачи
4. Создать поле с количеством незавершенных задач
5. Условие на поле с количеством незавершенных задач на равенство 0

29.

Шаги 1, 2 (Присоединить задачи к человеку)
db.employees.aggregate([
{ $lookup:
{ from: "tasks",
localField: "tasks",
foreignField: "_id",
as: "unended_tasks" } }
])

30.

Шаги 1, 2 (Присоединить задачи к
человеку)
{ _id: ObjectId("622b1b70856d7b828d8203d0"),
surname: 'Иванов',
name: 'Иван',
patronym: 'Иванович',
tasks:
[ ObjectId("6229f5bad35e8755fcf68e3a"),
ObjectId("6229f5b9d35e8755fcf68e39") ],
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00: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-04-24T00:00:00.000Z,
is_done: true } ] }
{ _id: ObjectId("622b1b70856d7b828d8203d1"),
surname: 'Петров',
name: 'Петр',
patronym: 'Петрович',
tasks: [ ObjectId("6229f5b9d35e8755fcf68e39") ],
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false } ] }

31.

Шаги 1, 2 (Присоединить задачи к человеку)
{ _id: ObjectId("622b1b70856d7b828d8203d2"),
surname: 'Иванова',
name: 'Анна',
patronym: 'Петровна',
tasks:
[ ObjectId("6229f5b9d35e8755fcf68e39"),
ObjectId("6229f5bad35e8755fcf68e3b") ],
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300
(Москва, стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false },
{ _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("622b1b70856d7b828d8203d3"),
surname: 'Менделеева',
name: 'Любовь',
patronym: 'Дмитриевна',
tasks: [ ObjectId("6229f5bad35e8755fcf68e3a") ],
unended_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-04-24T00:00:00.000Z,
is_done: true } ] }

32.

Шаг 3 Оставить в объекте, полученном присоединением только
незавершенные задачи
db.employees.aggregate([
{ $lookup:
{
from: "tasks",
localField: "tasks",
foreignField: "_id",
as: "unended_tasks"
}
},
{$project:{"_id":1,"surname":1,"name":1,"patronym":1,"unended_tasks":
{ $filter:
{input:"$unended_tasks",as: "tsk",
cond:{$eq:["$$tsk.is_done",false]}
}
}
},
]
)
}

33.

Шаг 3 Оставить в объекте, полученном присоединением только
незавершенные задачи
{ _id: ObjectId("622b1b70856d7b828d8203d0"),
surname: 'Иванов',
name: 'Иван',
patronym: 'Иванович',
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false } ] }
{ _id: ObjectId("622b1b70856d7b828d8203d1"),
surname: 'Петров',
name: 'Петр',
patronym: 'Петрович',
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false } ] }

34.

Шаг 3 Оставить в объекте, полученном присоединением только
незавершенные задачи
{ _id: ObjectId("622b1b70856d7b828d8203d2"),
surname: 'Иванова',
name: 'Анна',
patronym: 'Петровна',
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false },
{ _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("622b1b70856d7b828d8203d3"),
surname: 'Менделеева',
name: 'Любовь',
patronym: 'Дмитриевна',
unended_tasks: [] }

35.

Шаг 4. Создать поле с количеством незавершенных задач
db.employees.aggregate([
{ $lookup:
{
from: "tasks",
localField: "tasks",
foreignField: "_id",
as: "unended_tasks"
}
},
{$project:{"_id":1,"surname":1,"name":1,"patronym":1,"unended_tasks":
{ $filter:{input:"$unended_tasks",as: "tsk",cond:{$eq:["$$tsk.is_done",false]}}}
}
},
{$addFields:{"cnt_not_done":{$size:"$unended_tasks"}}},
]
)

36.

Шаг 4. Создать поле с количеством
незавершенных задач
{ _id: ObjectId("622b1b70856d7b828d8203d0"),
surname: 'Иванов',
name: 'Иван',
patronym: 'Иванович',
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false } ],
cnt_not_done: 1 }
{ _id: ObjectId("622b1b70856d7b828d8203d1"),
surname: 'Петров',
name: 'Петр',
patronym: 'Петрович',
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false } ],
cnt_not_done: 1 }

37.

Шаг 4. Создать поле с количеством незавершенных задач
{ _id: ObjectId("622b1b70856d7b828d8203d2"),
surname: 'Иванова',
name: 'Анна',
patronym: 'Петровна',
unended_tasks:
[ { _id: ObjectId("6229f5b9d35e8755fcf68e39"),
task_name: 'пользовательский интерфейс',
created: 'Thu Mar 10 2022 15:57:29 GMT+0300 (Москва,
стандартное время)',
started: 2022-03-24T00:00:00.000Z,
ended: 2022-04-24T00:00:00.000Z,
is_done: false },
{ _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 } ],
cnt_not_done: 2 }
{ _id: ObjectId("622b1b70856d7b828d8203d3"),
surname: 'Менделеева',
name: 'Любовь',
patronym: 'Дмитриевна',
unended_tasks: [],
cnt_not_done: 0 }

38.

Условие на поле с количеством
незавершенных задач на равенство
• {$match:{"cnt_not_done":0}}

39.

Человек, у которого нет незавершенных задач
db.employees.aggregate([
{ $lookup:
{
from: "tasks",
localField: "tasks",
foreignField: "_id",
as: "unended_tasks"
}
},
{$project:{"_id":1,"surname":1,"name":1,"patronym":1,"unended_tasks":
{ $filter:{input:"$unended_tasks",as: "tsk",cond:{$eq:["$$tsk.is_done",false]}}}
}
},
{$addFields:{"cnt_not_done":{$size:"$unended_tasks"}}},
{$match:{"cnt_not_done":0}}
]
)

40.

Человек, у которого нет незавершенных задач
db.employees.aggregate([
{ $lookup:
{
from: "tasks",
localField: "tasks",
foreignField: "_id",
as: "unended_tasks"
} },
{$project:{"_id":1,"surname":1,"name":1,"patronym":1,"unended_tasks":
{ $filter:{input:"$unended_tasks",as: "tsk",cond:{$eq:["$$tsk.is_done",false]}}}
}},
{$addFields:{"cnt_not_done":{$size:"$unended_tasks"}}},
{$match:{"cnt_not_done":0}} ] )
{ _id: ObjectId("622b1b70856d7b828d8203d3"),
surname: 'Менделеева',
name: 'Любовь',
patronym: 'Дмитриевна',
unended_tasks: [],
cnt_not_done: 0 }
English     Русский Rules