Донякъде е объркващо, тъй като имената са подобни, но group()
командата е различна функция и реализация от $group
оператор на тръбопровода в Aggregation Framework.
Командата group(), Aggregation Framework и MapReduce са заедно функции за агрегиране на MongoDB. Има известно припокриване на функциите, но ще се опитам да обясня разликите и ограниченията на всяка от MongoDB 2.2.0.
Забележка:вградени набори от резултати споменатите по-долу се отнасят до заявки, които се обработват в паметта с резултати, върнати в края на извикването на функцията. Алтернативните опции за изход (понастоящем налични само с MapReduce) могат да включват запазване на резултати в нова или съществуваща колекция.
group()
Команда
-
Прост синтаксис и функционалност за групиране .. аналогично на
GROUP BY
в SQL. -
Връща вграден набор от резултати (като масив от групирани елементи).
-
Реализиран с помощта на JavaScript двигателя; персонализиран
reduce()
функциите могат да бъдат написани в JavaScript. -
Текущи ограничения
-
Няма да се групира в резултатен набор с повече от 20 000 ключа.
-
Резултатите трябва да отговарят на ограниченията на BSON документ (понастоящем 16MB).
-
Приема заключване за четене и не позволява на други нишки да изпълняват JavaScript, докато работи.
-
Не работи с разчленени колекции.
-
-
Вижте също:примери за команди group() .
MapReduce
-
Реализира модела MapReduce за обработка на големи набори от данни.
-
Може да избира от една от няколкото изходни опции (вграден, нова колекция, сливане, замяна, намаляване)
-
Функциите MapReduce са написани на JavaScript.
-
Поддържа неразделени и разчленени входни колекции.
-
Може да се използва за инкрементално агрегиране върху големи колекции.
-
MongoDB 2.2 внедрява много по-добра поддръжка за намаляване на изхода на разчленена карта.
-
Текущи ограничения
-
Едно излъчване може да побере само половината от максималния размер на документа BSON на MongoDB (16MB).
-
Има заключване на JavaScript, така че сървърът на mongod може да изпълнява само една функция на JavaScript в даден момент.. обаче повечето стъпки на MapReduce са много кратки, така че заключванията могат да се предават често.
-
Функциите MapReduce могат да бъдат трудни за отстраняване на грешки. Можете да използвате
print()
иprintjson()
за да включите диагностичен изход вmongod
дневник. -
MapReduce обикновено не е интуитивен за програмисти, които се опитват да преведат опит за агрегиране на релационни заявки.
-
-
Вижте също:Примери за карти/намаляване .
Рамка за агрегиране
-
Нова функция в производствената версия на MongoDB 2.2.0 (август 2012 г.).
-
Проектиран със специфични цели за подобряване на производителността и използваемостта.
-
Връща вграден набор от резултати.
-
Поддържа неразделени и разчленени входни колекции.
-
Използва подход на „тръбопровод“, при който обектите се трансформират, докато преминават през серия от тръбопроводни оператори, като съпоставяне, проектиране, сортиране и групиране.
-
Операторите на тръбопроводи не трябва да създават един изходен документ за всеки входен документ:операторите могат също да генерират нови документи или да филтрират документи.
-
С помощта на прогнози можете да добавяте изчислени полета, да създавате нови виртуални подобекти и да извличате подполета в най-високото ниво на резултатите.
-
Операторите на тръбопровода могат да се повтарят според нуждите (например множество
$project
или$group
стъпки. -
Текущи ограничения
-
Резултатите се връщат на линия, така че са ограничени до максималния размер на документа, поддържан от сървъра (16MB)
-
Не поддържа толкова много опции за изход като MapReduce
-
Ограничено до оператори и изрази, поддържани от Aggregation Framework (т.е. не могат да пишат персонализирани функции)
-
Най-новата сървърна функция за агрегиране, така че има повече място за развитие по отношение на документация, набор от функции и използване.
-
-
Вижте също:Примери за Aggregation Framework .
Може ли някой да представи илюстрация или да ме насочи към връзка, където тези три понятия са обяснени заедно, като се вземат едни и същи примерни данни, за да мога лесно да ги сравня?
Обикновено няма да намерите примери, където би било полезно да сравните и трите подхода, но ето предишни въпроси на StackOverflow, които показват вариации:
- group() срещу Aggregation Framework
- MapReduce срещу Aggregation Framework