SlideShare a Scribd company logo
Практическое применение
MongoDB Aggregation
Framework
Hi! I’m Max Dadzerkin.
W
H MongoDB?
Y
Базовые понятия MongoDB
*Документо-ориентированная БД общего
назначения;

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

базы данных (databases);
коллекции (collections);
документы (documents);
поля (fields).
Практическое применение MongoDB Aggregation Framework
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)
Практическое применение MongoDB Aggregation Framework
НАДЕЖНОСТЬ
Replica sets
Практическое применение MongoDB Aggregation Framework
Практическое применение MongoDB Aggregation Framework
Практическое применение MongoDB Aggregation Framework
СКОРОСТЬ
• Денормализация данных;
• Индексы;
• Атомарные операции.
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
}

More Related Content

What's hot (10)

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

Viewers also liked (8)

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

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

PDF
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
PPTX
Построение индексов Redis
Petr Trofimov
 
PDF
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 
PPT
MongoDB basics in Russian
Oleg Kachan
 
PDF
C# Web. Занятие 16.
Igor Shkulipa
 
PPT
Web весна 2013 лекция 4
Technopark
 
PDF
всплывающее окно при закрытии сайта
Olga Pirozhenko
 
PDF
Web осень 2013 лекция 6
Technopark
 
PPTX
Основы MongoDB + NodeJS
Alexander Konovalov
 
PPT
MongoDB. Фокус на тестирование
Uladzimir Kryvenka
 
PDF
Стратегии масштабирования [NoBugs WTF PRO уровень]
NoBugs
 
PDF
KnockoutJS на примере 2ГИС-Онлайн
2ГИС Технологии
 
PDF
Grails & Groovy
Denys Sosuliev
 
PDF
Scino: Front-end [part-1]
SCINO
 
PPT
Кроссбраузерные решения в рекламной сети Яндекса
Media Gorod
 
PPTX
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
DevDay
 
PDF
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
Yandex
 
PDF
Jsfwdays 2013-2
Pavlo Iuriichuk
 
PPT
Web весна 2012 лекция 4
Technopark
 
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
Построение индексов Redis
Petr Trofimov
 
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 
MongoDB basics in Russian
Oleg Kachan
 
C# Web. Занятие 16.
Igor Shkulipa
 
Web весна 2013 лекция 4
Technopark
 
всплывающее окно при закрытии сайта
Olga Pirozhenko
 
Web осень 2013 лекция 6
Technopark
 
Основы MongoDB + NodeJS
Alexander Konovalov
 
MongoDB. Фокус на тестирование
Uladzimir Kryvenka
 
Стратегии масштабирования [NoBugs WTF PRO уровень]
NoBugs
 
KnockoutJS на примере 2ГИС-Онлайн
2ГИС Технологии
 
Grails & Groovy
Denys Sosuliev
 
Scino: Front-end [part-1]
SCINO
 
Кроссбраузерные решения в рекламной сети Яндекса
Media Gorod
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
DevDay
 
Разработка бизнес-приложений на OpenUI5 — Николай Надоричев, MOLGA Consulting
Yandex
 
Jsfwdays 2013-2
Pavlo Iuriichuk
 
Web весна 2012 лекция 4
Technopark
 
Ad

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

  • 2. Hi! I’m Max Dadzerkin.
  • 4. Базовые понятия MongoDB *Документо-ориентированная БД общего назначения; *Структурные единицы: • • • • базы данных (databases); коллекции (collections); документы (documents); поля (fields).
  • 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": "[email protected]" } } "_id": ObjectId("4b2d75476cc613d5ee95474d"), "type": "comment", "created": ISODate("2013-10-10T18:20:25.583Z"), "moderated": false, "text": "Comment text", "author": { "name": "author name", "email": "[email protected]" } }
  • 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 }