SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Практическое применение
MongoDB Aggregation
Framework
Hi! I’m Max Dadzerkin.
W
H MongoDB?
Y
Базовые понятия MongoDB
*Документо-ориентированная БД общего
назначения;

*Структурные единицы:
•
•
•
•

базы данных (databases);
коллекции (collections);
документы (documents);
поля (fields).
MongoDB
• Документы хранятся в формате BSON (Binary JSON);
• Поддерживаемые типы данных:
числа, строки, даты, регулярные выражения,
массивы, вложенные документы, Objectld,
бинарные данные;
• Отсутствует предопределенная схема документа.
{

{
"_id": ObjectId("4b2d75476cc613d5ee930164"),
"type": "",
"active": "true",
"created": ISODate("2013-10-10T18:20:25.583Z"),
"likes": 7,
"text": "Post text",
"tags": ["tag1", "tag2"],
"author": {
"name": "author name",
"email": "author@gmail.com"
}

}

"_id": ObjectId("4b2d75476cc613d5ee95474d"),
"type": "comment",
"created": ISODate("2013-10-10T18:20:25.583Z"),
"moderated": false,
"text": "Comment text",
"author": {
"name": "author name",
"email": "author@gmail.com"
}
}
SCALABLE
горизонтальное

масштабирование

с помощью шардинга
(sharding)
НАДЕЖНОСТЬ
Replica sets
СКОРОСТЬ
• Денормализация данных;
• Индексы;
• Атомарные операции.
Aggregation
Framework
Aggregation Framework
(1) Был добавлен в MongoDB 2.2 для выполнения
простых операций агрегации;
(2) Содержит набор операций, которые могут
быть
объединены
в
цепочки
(результат
предыдущей операции является входными
данными для последующей).
КАК

ЭТО РАБОТАЕТ?
(1) Определяем коллекцию, которую будем
трансформировать;
(2) Определяем цепочку операторов (pipeline);
(3) Коллекция проходит через цепочку;
(4) Результаты возвращаются как документ.
Соответствие SQL и Aggregation операций
SQL Terms and Functions

MongoDB Aggregation
Operators

WHERE

$match

GROUP BY

$group

HAVING

$match

SELECT

$project

ORDER BY

$sort
Простой
пример
ЗАДАЧА
Вывести количество работников с группировкой по должности, у
которых зарплата не менее заданного значения
Документ

{

"name": "employee 1",
"position": "Junior",
"salary": 400
}

SQL запрос
SELECT position, count(*)
FROM employees
WHERE salary >= 500
GROUP BY position

Aggregation запрос

db.employees.aggregate([
{"$match": {"salary": {"$gte": 500}}},
{"$group": {"_id": "$position", "count": {"$sum": 1}}}
])
РЕЗУЛЬТАТ ЗАПРОСА
{
"result": [
{ "_id": "Junior", "count": 1 },
{ "_id": "Senior", "count": 50 },
...
],
"ok": 1
}
Пример
реального
doc
{
"_id" : "16530152929",
"authorName" : "edcg",
"averageRating" : 3.625,
"comments" : [
{
"_id" : "443219543",
"moderationStatus" : "STATUS_NOT_MODERATED",
"authorName" : "pd14_98",
…
"commentType" : "NORMAL",
"commentBody" : "This comment is from someone",
}
],
"make" : "fiat",
"model" : "500",
"year" : "2012",
"moderationStatus" : "STATUS_PASSED",
"text" : "I've been waiting for this car to come to the US...",
"title" : "Fun, Cute but No Power“
…
}
$match
фильтрует документы, используя существующий синтаксис
для запросов
{ $match : { averageRating : { $gt : 4.0} } }
{
_id : 2,
averageRating : 4.025,
make : "fiat",
model : "500",
year : 2012

{
_id : 2,
averageRating : 4.025,
make : "fiat",
model : "500",
year : 2012

}
{
_id : 3,
averageRating : 3.5,
make : "fiat",
model : "500",
year : 2012

}

}
$project
(1) Меняет структуру документа;
(2) Добавляет, исключает или
переименовывает поля;

(3) Позволяет добавлять вычисляемые поля;
(4) Создает субдокументы.
Включение/исключение полей/cоздание
вложенного документа
$project: { _id: 0, title: 1, text: 1,
vehicle: { make: "$make", model: "$model", year: "$year" }
}
{
"_id" : "16530152929",
"authorName" : "edcg",
"make" : "fiat",
"model" : "500",
"year" : "2012",
"targetId" : "64851612",
"moderationStatus" :
"STATUS_PASSED",
"text" : "I've been waiting for this
car to come to the US...",
"title" : "Fun, Cute but No Power"
}

{
title : "Fun, Cute but No Power“,
text : "I've been waiting for this car
to come to the US...“,
vehicle: {
make: “fiat”,
model: “500“,
year: “2012”
}
}
$group
(1) Группирует

документы по ID:

Поле, объект, константа

(2) Другие

поля (кроме ID) вычисляются:

• Операторы группировки (group operators): $first, $last,
$max, $min, $avg, $sum…
• Операторы с логическими значениями (boolean
operators): $and, $or, $not
• Операторы сравнения (comparison operators): $eq, $gt,
$gte, $lt, $lte, $ne
• Условные выражения (conditional expressions): $cond,
$ifNull

…
$unwind
(1) Операция над полями типа массив;
(2) Возвращает новый документ для каждого
элемента массива:
Массив заменяется значением элемента;
Если поле отсутствует или пустое, ничего не
возвращается;
• В случае, если поле имеет другой тип (не массив),
возвращается ошибка.
•
•
$unwind
{ $unwind: "$comments" }

{

"_id" : "16530152929",
"comments" : {
"type" : "NORMAL",
"body" : "comment"
}
"make" : "fiat",
"model" : "500",
"year" : "2012",
"title" : "Fun, Cute but No Power"

{
"_id": "16530152929",
"comments": [
{
"type": "NORMAL",
"body": "comment"
},
{
"type": "IMPORTANT",
"body": "important comment"
}
],
"make": "fiat",
"model": "500",
"year": "2012",
"title": "Fun, Cute but No Power"

}
{
"_id": "16530152929",
"comments": {
"type": "IMPORTANT",
"body": "important comment"
},
"make": "fiat",
"model": "500",
"year": "2012",
"title": "Fun, Cute but No Power"

}

}
$sort, $limit, $skip
(1) Сортирует документы по одному или
нескольким полям;

(2) Позволяют реализовывать
постраничный вывод.
ПРИМЕРЫ
Статистика по отзывам в определенном
статусе с группировкой по make
{ "$match" : { "moderationStatus" : "STATUS_PASSED"} }, // возвращает все отзывы
в заданном статусе
{ "$group": { "_id": "$make", "counts": { "$sum": 1 } } } // суммирует количество
отзывов с группировкой по полю «make»
{
"result": [
…...
{
"_id": "chevrolet",
"counts": 25374
}
…...
],
"ok": 1
}
Количество утвержденных комментариев для
каждого производителя (весь запрос)

{ "$match" : { "comments.moderationStatus" : "STATUS_PASSED"} } , // возвращает
все отзывы, у которых есть комментарии в заданном статусе
{ "$unwind" : "$comments"} , // разворачивает массив комментариев
{ "$match" : { "comments.moderationStatus" : "STATUS_PASSED"} }, // фильтрует
документы по статусу комментария
{ "$group" : { "_id" : "$make" , "counts" : { "$sum" : 1} } } // суммирует количество
комментариев с группировкой по полю «make»
Количество утвержденных комментариев для
каждого производителя (оператор 1)
{ "$match" : { "comments.moderationStatus" : "STATUS_PASSED"} }
{
"make": "bmw",
"comments": [
{
"body": "comment21",
"moderationStatus": "STATUS_REJECTED"
} {
]
}

"make": "bmw",
"comments": [
{
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
} {
]
"make": "acura",
}
"comments": [
{
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
},
{
"body": "comment 12",
"moderationStatus": "STATUS_REJECTED"
}
]
}

{
"make": "acura",
"comments": [
{
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
},
{
"body": "comment 12",
"moderationStatus": "STATUS_REJECTED"
}
]
}

{
"make": "bmw",
"comments": [
{
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
}
]
}
Количество утвержденных комментариев для
каждого производителя (оператор 2)
{

"$unwind" : "$comments"}

{

{
"make": "acura",
"comments": [
{
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
},
{
"body": "comment 12",
"moderationStatus": "STATUS_REJECTED"
}
]

"make": "acura",
"comments": {
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
}

}
{
"make": "acura",
"comments": {
"body": "comment12",
"moderationStatus": "STATUS_REJECTED"
}

}
}

{
"make": "bmw",
"comments": [
{
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
}
]
}

{
"make": "bmw",
"comments": {
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
}
}
Количество утвержденных комментариев для
каждого производителя (оператор 3)
{ "$match" : { "comments.moderationStatus" : "STATUS_PASSED "} }
{
"make": "acura",
"comments": {
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
}

{
"make": "acura",
"comments": {
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
}

}
{
"make": "acura",
"comments": {
"body": "comment12",
"moderationStatus": "STATUS_REJECTED"
}

}
{
"make": "bmw",
"comments": {
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
}

}
{
"make": "bmw",
"comments": {
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
}

}

}
Количество утвержденных комментариев для
каждого производителя (оператор 4)
{ "$group" : { "_id" : "$make" , "counts" : { "$sum" : 1} } }
{

{

"result": [
{
"_id": "acura",
"counts": 1
},
{
"_id": "bmw",
"counts": 1
}
],
"ok": 1

"make": "acura",
"comments": {
"body": "comment11",
"moderationStatus": "STATUS_PASSED"
}
}
{

"make": "bmw",
"comments": {
"body": "comment21",
"moderationStatus": "STATUS_PASSED"
}
}

}
Q&A
СПАСИБО.
Запрос со *
Постраничный вывод отзывов с подсчетом
количества комментариев
{
"$match": { "make": "audi", "model": "a4", "year": "2010", "moderationStatus": "STATUS_PASSED" }
},
{ "$sort": { "created": -1 } } ,
{ "$limit": 20 } ,
{ "$skip": 10 } ,
{ "$project":
{ "title": 1, "text": 1, "created": 1, "averageRating": 1, "targetId": 1, "comments": "$comments" }
},
{ "$unwind": "$comments" } ,
{
"$group": {
"_id": {
"_id": "$_id", "title": "$title", "targetId": "$targetId", "text": "$text", "created": "$created",
"averageRating": "$averageRating"
},
"commentsCount": { "$sum": 1 }
}
},
{
"$sort": {
"_id.created": -1
}
}
Постраничный вывод отзывов с подсчетом
количества комментариев (исправленная версия)
{
"$match": { "make": "audi", "model": "a4", "year": "2010", "moderationStatus": "STATUS_PASSED" }
},
{
"$sort": { "created": -1 }
},
{ "$limit": 20 } ,
{ "$skip": 10 } ,
{
"$project": { "title": 1, "text": 1, "created": 1, "averageRating": 1, "targetId": 1,
"comments": {
"$ifNull": [ "$comments" , [ { "moderationStatus": "STATUS_REJECTED" } ] ]
}
}
},
{ "$unwind": "$comments" } ,
{ "$group": { "_id": { "_id": "$_id", "title": "$title", "targetId": "$targetId", "text": "$text",
"created": "$created", "averageRating": "$averageRating" },
"commentsCount": {
"$sum": { "$cond": [ { "$eq": [ "$comments.moderationStatus" , "STATUS_REJECTED" ] } , 0 , 1 ] }
}
}
},
{ "$sort": { "_id.created": -1 } }
Постраничный вывод отзывов с подсчетом
количества комментариев (результат запроса)
{
"result": [
{
"_id": {
"_id": "206121807",
"title": "Fantastic",
"targetId": "101186697",
"text": "My third Audi A4 and my favorite so far.",
"created": ISODate("2010-08-31T16:23:25Z"),
"averageRating": 5
},
"commentsCount": 5
},
{
"_id": {
"_id": "206121808",
"title": "Awesome",
"targetId": "101186697",
"text": "Audi A4 is my favorite car ever",
"created": ISODate("2010-09-14T13:16:21Z"),
"averageRating": 5
},
"commentsCount": 0
}
……...
],
"ok": 1
}

Contenu connexe

Tendances

Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Fwdays
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Встраивание языка в строковой интерполятор
Встраивание языка в строковой интерполяторВстраивание языка в строковой интерполятор
Встраивание языка в строковой интерполяторMichael Limansky
 
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...Victoria Malaya
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRAMBLER&Co
 
Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подходаIgor Kashkuta
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSSFDConf
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)Anton Bukov
 

Tendances (10)

Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Встраивание языка в строковой интерполятор
Встраивание языка в строковой интерполяторВстраивание языка в строковой интерполятор
Встраивание языка в строковой интерполятор
 
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
 
Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подхода
 
Yserver
YserverYserver
Yserver
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSS
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 

En vedette

MongoDB Aggregation MongoSF May 2011
MongoDB Aggregation MongoSF May 2011MongoDB Aggregation MongoSF May 2011
MongoDB Aggregation MongoSF May 2011Chris Westin
 
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...MongoDB
 
MongoDB's New Aggregation framework
MongoDB's New Aggregation frameworkMongoDB's New Aggregation framework
MongoDB's New Aggregation frameworkChris Westin
 
Sharding
ShardingSharding
ShardingMongoDB
 
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...Gianfranco Palumbo
 
The Aggregation Framework
The Aggregation FrameworkThe Aggregation Framework
The Aggregation FrameworkMongoDB
 
What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)Rudy De Busscher
 
OOP 2013 NoSQL Suche
OOP 2013 NoSQL SucheOOP 2013 NoSQL Suche
OOP 2013 NoSQL Sucheadesso AG
 

En vedette (8)

MongoDB Aggregation MongoSF May 2011
MongoDB Aggregation MongoSF May 2011MongoDB Aggregation MongoSF May 2011
MongoDB Aggregation MongoSF May 2011
 
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
MongoDB Analytics: Learn Aggregation by Example - Exploratory Analytics and V...
 
MongoDB's New Aggregation framework
MongoDB's New Aggregation frameworkMongoDB's New Aggregation framework
MongoDB's New Aggregation framework
 
Sharding
ShardingSharding
Sharding
 
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
How to leverage MongoDB for Big Data Analysis and Operations with MongoDB's A...
 
The Aggregation Framework
The Aggregation FrameworkThe Aggregation Framework
The Aggregation Framework
 
What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)What is tackled in the Java EE Security API (Java EE 8)
What is tackled in the Java EE Security API (Java EE 8)
 
OOP 2013 NoSQL Suche
OOP 2013 NoSQL SucheOOP 2013 NoSQL Suche
OOP 2013 NoSQL Suche
 

Similaire à Практическое применение MongoDB Aggregation Framework

Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн2ГИС Технологии
 
Построение индексов Redis
Построение индексов RedisПостроение индексов Redis
Построение индексов RedisPetr Trofimov
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнDevDay
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in RussianOleg Kachan
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта  всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта Olga Pirozhenko
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
MongoDB. Фокус на тестирование
MongoDB. Фокус на тестированиеMongoDB. Фокус на тестирование
MongoDB. Фокус на тестированиеUladzimir Kryvenka
 
KnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-ОнлайнKnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-Онлайн2ГИС Технологии
 
Scino: Front-end [part-1]
Scino: Front-end [part-1]Scino: Front-end [part-1]
Scino: Front-end [part-1]SCINO
 
Кроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети ЯндексаКроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети ЯндексаMedia Gorod
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...DevDay
 
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA ConsultingРазработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA ConsultingYandex
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 

Similaire à Практическое применение MongoDB Aggregation Framework (20)

Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Построение индексов Redis
Построение индексов RedisПостроение индексов Redis
Построение индексов Redis
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in Russian
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта  всплывающее окно при закрытии сайта
всплывающее окно при закрытии сайта
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Основы MongoDB + NodeJS
Основы MongoDB + NodeJSОсновы MongoDB + NodeJS
Основы MongoDB + NodeJS
 
MongoDB. Фокус на тестирование
MongoDB. Фокус на тестированиеMongoDB. Фокус на тестирование
MongoDB. Фокус на тестирование
 
KnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-ОнлайнKnockoutJS на примере 2ГИС-Онлайн
KnockoutJS на примере 2ГИС-Онлайн
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
Scino: Front-end [part-1]
Scino: Front-end [part-1]Scino: Front-end [part-1]
Scino: Front-end [part-1]
 
Кроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети ЯндексаКроссбраузерные решения в рекламной сети Яндекса
Кроссбраузерные решения в рекламной сети Яндекса
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
 
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA ConsultingРазработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
 
Ci
CiCi
Ci
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 

Практическое применение MongoDB Aggregation Framework

  • 2. Hi! I’m Max Dadzerkin.
  • 4. Базовые понятия MongoDB *Документо-ориентированная БД общего назначения; *Структурные единицы: • • • • базы данных (databases); коллекции (collections); документы (documents); поля (fields).
  • 5.
  • 6. MongoDB • Документы хранятся в формате BSON (Binary JSON); • Поддерживаемые типы данных: числа, строки, даты, регулярные выражения, массивы, вложенные документы, Objectld, бинарные данные; • Отсутствует предопределенная схема документа.
  • 7. { { "_id": ObjectId("4b2d75476cc613d5ee930164"), "type": "", "active": "true", "created": ISODate("2013-10-10T18:20:25.583Z"), "likes": 7, "text": "Post text", "tags": ["tag1", "tag2"], "author": { "name": "author name", "email": "author@gmail.com" } } "_id": ObjectId("4b2d75476cc613d5ee95474d"), "type": "comment", "created": ISODate("2013-10-10T18:20:25.583Z"), "moderated": false, "text": "Comment text", "author": { "name": "author name", "email": "author@gmail.com" } }
  • 9.
  • 11.
  • 12.
  • 13.
  • 14. СКОРОСТЬ • Денормализация данных; • Индексы; • Атомарные операции.
  • 16. Aggregation Framework (1) Был добавлен в MongoDB 2.2 для выполнения простых операций агрегации; (2) Содержит набор операций, которые могут быть объединены в цепочки (результат предыдущей операции является входными данными для последующей).
  • 17. КАК ЭТО РАБОТАЕТ? (1) Определяем коллекцию, которую будем трансформировать; (2) Определяем цепочку операторов (pipeline); (3) Коллекция проходит через цепочку; (4) Результаты возвращаются как документ.
  • 18. Соответствие SQL и Aggregation операций SQL Terms and Functions MongoDB Aggregation Operators WHERE $match GROUP BY $group HAVING $match SELECT $project ORDER BY $sort
  • 20. ЗАДАЧА Вывести количество работников с группировкой по должности, у которых зарплата не менее заданного значения Документ { "name": "employee 1", "position": "Junior", "salary": 400 } SQL запрос SELECT position, count(*) FROM employees WHERE salary >= 500 GROUP BY position Aggregation запрос db.employees.aggregate([ {"$match": {"salary": {"$gte": 500}}}, {"$group": {"_id": "$position", "count": {"$sum": 1}}} ])
  • 21. РЕЗУЛЬТАТ ЗАПРОСА { "result": [ { "_id": "Junior", "count": 1 }, { "_id": "Senior", "count": 50 }, ... ], "ok": 1 }
  • 23. { "_id" : "16530152929", "authorName" : "edcg", "averageRating" : 3.625, "comments" : [ { "_id" : "443219543", "moderationStatus" : "STATUS_NOT_MODERATED", "authorName" : "pd14_98", … "commentType" : "NORMAL", "commentBody" : "This comment is from someone", } ], "make" : "fiat", "model" : "500", "year" : "2012", "moderationStatus" : "STATUS_PASSED", "text" : "I've been waiting for this car to come to the US...", "title" : "Fun, Cute but No Power“ … }
  • 24. $match фильтрует документы, используя существующий синтаксис для запросов { $match : { averageRating : { $gt : 4.0} } } { _id : 2, averageRating : 4.025, make : "fiat", model : "500", year : 2012 { _id : 2, averageRating : 4.025, make : "fiat", model : "500", year : 2012 } { _id : 3, averageRating : 3.5, make : "fiat", model : "500", year : 2012 } }
  • 25. $project (1) Меняет структуру документа; (2) Добавляет, исключает или переименовывает поля; (3) Позволяет добавлять вычисляемые поля; (4) Создает субдокументы.
  • 26. Включение/исключение полей/cоздание вложенного документа $project: { _id: 0, title: 1, text: 1, vehicle: { make: "$make", model: "$model", year: "$year" } } { "_id" : "16530152929", "authorName" : "edcg", "make" : "fiat", "model" : "500", "year" : "2012", "targetId" : "64851612", "moderationStatus" : "STATUS_PASSED", "text" : "I've been waiting for this car to come to the US...", "title" : "Fun, Cute but No Power" } { title : "Fun, Cute but No Power“, text : "I've been waiting for this car to come to the US...“, vehicle: { make: “fiat”, model: “500“, year: “2012” } }
  • 27. $group (1) Группирует документы по ID: Поле, объект, константа (2) Другие поля (кроме ID) вычисляются: • Операторы группировки (group operators): $first, $last, $max, $min, $avg, $sum… • Операторы с логическими значениями (boolean operators): $and, $or, $not • Операторы сравнения (comparison operators): $eq, $gt, $gte, $lt, $lte, $ne • Условные выражения (conditional expressions): $cond, $ifNull …
  • 28. $unwind (1) Операция над полями типа массив; (2) Возвращает новый документ для каждого элемента массива: Массив заменяется значением элемента; Если поле отсутствует или пустое, ничего не возвращается; • В случае, если поле имеет другой тип (не массив), возвращается ошибка. • •
  • 29. $unwind { $unwind: "$comments" } { "_id" : "16530152929", "comments" : { "type" : "NORMAL", "body" : "comment" } "make" : "fiat", "model" : "500", "year" : "2012", "title" : "Fun, Cute but No Power" { "_id": "16530152929", "comments": [ { "type": "NORMAL", "body": "comment" }, { "type": "IMPORTANT", "body": "important comment" } ], "make": "fiat", "model": "500", "year": "2012", "title": "Fun, Cute but No Power" } { "_id": "16530152929", "comments": { "type": "IMPORTANT", "body": "important comment" }, "make": "fiat", "model": "500", "year": "2012", "title": "Fun, Cute but No Power" } }
  • 30. $sort, $limit, $skip (1) Сортирует документы по одному или нескольким полям; (2) Позволяют реализовывать постраничный вывод.
  • 32. Статистика по отзывам в определенном статусе с группировкой по make { "$match" : { "moderationStatus" : "STATUS_PASSED"} }, // возвращает все отзывы в заданном статусе { "$group": { "_id": "$make", "counts": { "$sum": 1 } } } // суммирует количество отзывов с группировкой по полю «make» { "result": [ …... { "_id": "chevrolet", "counts": 25374 } …... ], "ok": 1 }
  • 33. Количество утвержденных комментариев для каждого производителя (весь запрос) { "$match" : { "comments.moderationStatus" : "STATUS_PASSED"} } , // возвращает все отзывы, у которых есть комментарии в заданном статусе { "$unwind" : "$comments"} , // разворачивает массив комментариев { "$match" : { "comments.moderationStatus" : "STATUS_PASSED"} }, // фильтрует документы по статусу комментария { "$group" : { "_id" : "$make" , "counts" : { "$sum" : 1} } } // суммирует количество комментариев с группировкой по полю «make»
  • 34. Количество утвержденных комментариев для каждого производителя (оператор 1) { "$match" : { "comments.moderationStatus" : "STATUS_PASSED"} } { "make": "bmw", "comments": [ { "body": "comment21", "moderationStatus": "STATUS_REJECTED" } { ] } "make": "bmw", "comments": [ { "body": "comment21", "moderationStatus": "STATUS_PASSED" } { ] "make": "acura", } "comments": [ { "body": "comment11", "moderationStatus": "STATUS_PASSED" }, { "body": "comment 12", "moderationStatus": "STATUS_REJECTED" } ] } { "make": "acura", "comments": [ { "body": "comment11", "moderationStatus": "STATUS_PASSED" }, { "body": "comment 12", "moderationStatus": "STATUS_REJECTED" } ] } { "make": "bmw", "comments": [ { "body": "comment21", "moderationStatus": "STATUS_PASSED" } ] }
  • 35. Количество утвержденных комментариев для каждого производителя (оператор 2) { "$unwind" : "$comments"} { { "make": "acura", "comments": [ { "body": "comment11", "moderationStatus": "STATUS_PASSED" }, { "body": "comment 12", "moderationStatus": "STATUS_REJECTED" } ] "make": "acura", "comments": { "body": "comment11", "moderationStatus": "STATUS_PASSED" } } { "make": "acura", "comments": { "body": "comment12", "moderationStatus": "STATUS_REJECTED" } } } { "make": "bmw", "comments": [ { "body": "comment21", "moderationStatus": "STATUS_PASSED" } ] } { "make": "bmw", "comments": { "body": "comment21", "moderationStatus": "STATUS_PASSED" } }
  • 36. Количество утвержденных комментариев для каждого производителя (оператор 3) { "$match" : { "comments.moderationStatus" : "STATUS_PASSED "} } { "make": "acura", "comments": { "body": "comment11", "moderationStatus": "STATUS_PASSED" } { "make": "acura", "comments": { "body": "comment11", "moderationStatus": "STATUS_PASSED" } } { "make": "acura", "comments": { "body": "comment12", "moderationStatus": "STATUS_REJECTED" } } { "make": "bmw", "comments": { "body": "comment21", "moderationStatus": "STATUS_PASSED" } } { "make": "bmw", "comments": { "body": "comment21", "moderationStatus": "STATUS_PASSED" } } }
  • 37. Количество утвержденных комментариев для каждого производителя (оператор 4) { "$group" : { "_id" : "$make" , "counts" : { "$sum" : 1} } } { { "result": [ { "_id": "acura", "counts": 1 }, { "_id": "bmw", "counts": 1 } ], "ok": 1 "make": "acura", "comments": { "body": "comment11", "moderationStatus": "STATUS_PASSED" } } { "make": "bmw", "comments": { "body": "comment21", "moderationStatus": "STATUS_PASSED" } } }
  • 38. Q&A
  • 41. Постраничный вывод отзывов с подсчетом количества комментариев { "$match": { "make": "audi", "model": "a4", "year": "2010", "moderationStatus": "STATUS_PASSED" } }, { "$sort": { "created": -1 } } , { "$limit": 20 } , { "$skip": 10 } , { "$project": { "title": 1, "text": 1, "created": 1, "averageRating": 1, "targetId": 1, "comments": "$comments" } }, { "$unwind": "$comments" } , { "$group": { "_id": { "_id": "$_id", "title": "$title", "targetId": "$targetId", "text": "$text", "created": "$created", "averageRating": "$averageRating" }, "commentsCount": { "$sum": 1 } } }, { "$sort": { "_id.created": -1 } }
  • 42. Постраничный вывод отзывов с подсчетом количества комментариев (исправленная версия) { "$match": { "make": "audi", "model": "a4", "year": "2010", "moderationStatus": "STATUS_PASSED" } }, { "$sort": { "created": -1 } }, { "$limit": 20 } , { "$skip": 10 } , { "$project": { "title": 1, "text": 1, "created": 1, "averageRating": 1, "targetId": 1, "comments": { "$ifNull": [ "$comments" , [ { "moderationStatus": "STATUS_REJECTED" } ] ] } } }, { "$unwind": "$comments" } , { "$group": { "_id": { "_id": "$_id", "title": "$title", "targetId": "$targetId", "text": "$text", "created": "$created", "averageRating": "$averageRating" }, "commentsCount": { "$sum": { "$cond": [ { "$eq": [ "$comments.moderationStatus" , "STATUS_REJECTED" ] } , 0 , 1 ] } } } }, { "$sort": { "_id.created": -1 } }
  • 43. Постраничный вывод отзывов с подсчетом количества комментариев (результат запроса) { "result": [ { "_id": { "_id": "206121807", "title": "Fantastic", "targetId": "101186697", "text": "My third Audi A4 and my favorite so far.", "created": ISODate("2010-08-31T16:23:25Z"), "averageRating": 5 }, "commentsCount": 5 }, { "_id": { "_id": "206121808", "title": "Awesome", "targetId": "101186697", "text": "Audi A4 is my favorite car ever", "created": ISODate("2010-09-14T13:16:21Z"), "averageRating": 5 }, "commentsCount": 0 } ……... ], "ok": 1 }