Mongodb Поясніть рамки агрегації


118

Чи є в MongoDB функція пояснення для Агрегативної рамки? Я не бачу цього в документації.

Якщо ні, чи є інший спосіб перевірити, як виконується запит у рамках агрегації?

Я знаю, що знаходжу тебе просто

db.collection.find().explain()

Але в рамках агрегації я отримую помилку

db.collection.aggregate(
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { 
        $group: 
        { 
            _id : { id: "$_id"},
            "count": { $sum:1 } 
        }
    },
    { $sort: {"count":-1}}
).explain()

Відповіді:


172

Починаючи з версії 3.0 MongoDB, просто змінюючи замовлення з

collection.aggregate(...).explain()

до

collection.explain().aggregate(...)

дасть бажані результати (документація тут ).

Для старих версій> = 2.6 вам потрібно буде скористатися explainопцією для операцій з конвеєрним трубопроводом

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Важливі з Aggregation Framework є те , що індекс може бути використаний тільки для вилучення вихідних даних для трубопроводу (наприклад , використання $match, $sort, $geonearна початку трубопроводу), а також подальший $lookupі $graphLookupетапах. Після того, як дані будуть отримані в конвеєр агрегації для обробки (наприклад, проходження етапів, таких як $project, $unwindі $group), подальша маніпуляція буде в пам'яті (можливо, використовуючи тимчасові файли, якщо встановлено allowDiskUseпараметр).

Оптимізація трубопроводів

Загалом, ви можете оптимізувати конвеєрні трубопроводи шляхом:

  • Початок трубопроводу зі $matchстадією, щоб обмежити обробку відповідними документами.
  • Забезпечення початкових $match/ $sortетапів підтримується ефективним індексом .
  • Фільтрація даних в початку використання $match, $limitі $skip.
  • Мінімізація непотрібних етапів та маніпулювання документами (можливо, перегляд вашої схеми, якщо потрібна складна гімнастика з накопичення).
  • Скориставшись новими операторами агрегації, якщо ви оновили свій сервер MongoDB. Наприклад, MongoDB 3.4 додав багато нових етапів агрегування та виразів, включаючи підтримку роботи з масивами, рядками та гранями.

Існує також ряд оптимізацій конвеєрного конвеєра, які автоматично відбуваються залежно від версії сервера MongoDB. Наприклад, сусідні етапи можуть бути об'єднані та / або упорядковані для поліпшення виконання, не впливаючи на вихідні результати.

Обмеження

Як і в MongoDB 3.4, параметр Aggregation Framework explainнадає інформацію про те, як обробляється конвеєр, але не підтримує той же рівень деталізації, що і executionStatsрежим find()запиту. Якщо ви зосереджені на оптимізації виконання початкового запиту, вам, ймовірно, буде корисно переглянути еквівалентний find().explain()запит executionStatsабо allPlansExecutionбагатослівність .

Існує декілька відповідних запитів на функцію перегляду / оновлення у трекері випуску MongoDB щодо детальніших статистичних даних щодо виконання, щоб допомогти оптимізувати / профілі агрегації трубопроводів:


Дякуємо за інформацію, я побачу, чи можу я внести якісь зміни.
SCB

Чи не повинен $sortоб’єкт знаходитись у масиві трубопроводу?
JohnnyHK

@JohnnyHK: Так. Деякі добрі люди «виправляють» відповідь неправильно :).
Стенні

Але це не дає "страти страти"
Kanagavelu Sugumar

1
@KanagaveluSugumar Я оновив відповідь із роз'ясненням explainобмежень Агрегативної рамки , а також відповідними запитами щодо функцій додаткової статистики виконання.
Stennie

29

Починаючи з версії 2.6.x mongodb дозволяє користувачам пояснювати за допомогою агрегації фреймворку .

Все, що вам потрібно зробити - це додати пояснення: вірно

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)

Завдяки Рафа я знаю, що це можна було зробити навіть в 2,4, але тільки через runCommand(). Але тепер ви також можете використовувати агрегат.


5
Насправді, ви можете пояснити агрегати з db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})MongoDB 2.2.
Рафа

1
Ви маєте рацію, в 2.2 і 2.4 ви можете пояснити агрегати лише через runCommand. Дякуємо за підсумки.
Рафа

3
Хоча опція технічно існує через runCommand до 2.6, вона не гарантує отримання правильних результатів і її не слід підтримувати. Вам слід використовувати це лише у версії 2.5.3 або новішої версії (і, напевно, все ще можуть виникнути помилки, що виховуються до випуску 2.6).
Stennie

20

Агрегаційна рамка

Структура агрегації - це набір інструментів аналітики всередині, MongoDBякі дозволяють запускати різні типи звітів чи аналізів на документи в одній або кількох колекціях. Виходячи з ідеї трубопроводу. Ми беремо дані з MongoDBколекції і передаємо документи з цієї колекції через один або декілька етапів, кожен з яких виконує різні операції на своїх входах. Кожен етап приймає як вхід будь-який етап перед тим, як він був створений як вихід. А входи та виходи для всіх етапів - це потік документів. Кожен етап має конкретну роботу, яку він виконує. Він очікує конкретної форми документа і виробляє конкретний вихід, який сам по собі є документом. В кінці трубопроводу ми отримуємо доступ до виходу.

етап каркасу агрегації

Окремий етап - це блок обробки даних. Кожен етап приймає за вхід потік документів по одному, обробляє кожен документ по одному і виробляє вихідний потік документів. Знову по одному. Кожен етап пропонує набір регуляторів або перемикачів, якими ми можемо керувати, щоб параметризувати етап для виконання будь-якої задачі, яка нам цікава. Таким чином, етап виконує загальне завдання - загальне завдання певного роду і параметризує етап для конкретного набору документів, з якими ми працюємо. І саме те, що ми хотіли б зробити на цьому етапі з цими документами. Ці налаштування зазвичай мають форму операторів, які ми можемо надати, які будуть змінювати поля, виконувати арифметичні операції, переробляти документи або виконувати якесь завдання накопичення, а також перевірку інших речей. Часто буває так, що ми '

однотипний ступінь багаторазовий протягом одного трубопроводу

Наприклад, ми можемо бажати виконати початковий фільтр, щоб нам не довелося передавати всю колекцію в наш конвеєр. Але потім, після деякої додаткової обробки, хочу ще раз фільтрувати, використовуючи інший набір критеріїв. Отже, для резюме трубопровід працює з MongoDBколекцією. Вони складаються з етапів, кожен з яких виконує різні завдання по обробці даних на своєму введенні та створює документи як вихід, що передаються на наступний етап. І, нарешті, в кінці трубопроводу виробляється висновок, що ми можемо щось робити в межах нашої програми. У багатьох випадках необхідно включати один і той же тип стадії, кілька разів в межах окремого трубопроводу.


спасибі, корисно було зрозуміти краще.
Арун Пратап Сінгх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.