Конвейера агрегации MongoDB

задняя часть SQL Apple MongoDB

концепция трубопровода

Сначала введем понятие конвейера.При использовании многопоточности POSIX определяется важный метод конвейера, который называется «конвейер» или «конвейер». Этот метод позволяет последовательно выполнять данные группой потоков. следует:

Чтобы понять с помощью объектно-ориентированного мышления, весь конвейер можно понимать как конвейер передачи данных; каждый рабочий поток в конвейере можно понимать как рабочую стадию всего конвейера, а взаимодействие между этими рабочими потоками — это Ring-to. -звенеть. Рабочий поток, который находится ближе к входному порту, является стадией этапа работы с более ранним таймингом, и результат его работы повлияет на результат работы следующего этапа (этапа) рабочего потока, то есть следующий этап зависит от вывода предыдущий этап и предыдущий этап Выход этапа становится входом этого этапа. Это также общая черта трубопроводов.

трубы в монгодб

В версии 2.2 mongodb представила новую функцию фреймворка агрегации (aggregate framework), которая представляет собой новый фреймворк для агрегации, его концепция аналогична конвейеру обработки данных, каждый документ проходит через конвейер, состоящий из нескольких узлов, каждый узел довольно Стадия в конвейере имеет свои функции (группировка, фильтрация и т.д.).После обработки документа конвейером, наконец, выводится соответствующий результат.Основных функций конвейера две:

  1. «Фильтровать» документы, чтобы отфильтровать подходящие документы
  2. «Преобразовать» документ, чтобы изменить форму вывода документа

Другие функции включают группировку и сортировку по указанному полю. И на каждом этапе вы также можете использовать операторы выражений для вычисления средних значений, объединения строк и других связанных операций. Pipeline представляет собой альтернативу MapReduce. MapReduce относительно сложен в использовании, а конвейер имеет фиксированный интерфейс (операторное выражение) и относительно прост в использовании. Pipeline обычно является предпочтительным методом для большинства задач агрегирования.

Aggregate в mongodb в основном используется для простой обработки данных (усреднение, суммирование и т. д.) и возвращает результат вычисленных данных, аналогичный встроенным функциям в sql (count() и т. д.) Пример применения фреймворка агрегации приведен на официальном сайте mongodb:

Видно, что конвейер агрегации содержит несколько этапов, каждый из которых представляет собой обработку данных.Агрегация в mongodb использует метод агрегата().Синтаксис выглядит следующим образом:>db.COLLECTION_NAME.aggregate(pipeline,options)Где конвейер — это массив, синтаксис такой:[{<stage1>,<stage2>,<stage3>,...}]Синтаксис для каждого из них:{$管道操作符:{ 管道表达式 } }

Ниже перечислены некоторые из наиболее распространенных операторов канала и их функции, а примеры будут приведены позже:

оператор описывать грамматика
$project Проекция данных, в основном используется для переименования, добавления, удаления полей db.article.aggregate({ $project : {title : 1 ,author : 1 ,}});
$match Фильтровать, фильтровать документы, которые соответствуют условиям, в качестве ввода следующего этапа db.articles.aggregate( [{ $match : { score : { $gt : 70, $lte : 90 } } },{ $group: { _id: null, count: { $sum: 1 } } }] );
$limit Ограничьте количество документов, которые проходят через конвейер db.article.aggregate({ $limit : 5 });
$skip Пропустить некоторые документы перед обработкой коллекции ожидающих операций db.article.aggregate({ $skip : 5 });
$unwind разбить массив на отдельные поля db.article.aggregate({$project:{author:1,title:1,tags:1}},{$unwind:"$tags"})
$group групповые данные db.article.aggregate({ $group : {_id : "$author",docsPerAuthor : { $sum : 1 },viewsPerAuthor : { $sum : "$pageViews" }}});
$sort Сортировать документы по указанному полю db.users.aggregate( { $sort : { age : -1, posts: 1 } });
$sample Произвольно выбирает указанное количество документов для ввода. { $sample: { size: <positive integer> } }
$out Это должен быть последний этап конвейера, потому что окончательный результат расчета записывается в указанную коллекцию.
$indexStats Возвращает использование каждого индекса коллекции данных { $indexStats: { } }

Дополнительные операторы канала см. в официальном документе mongodb, который написан более подробно, но содержит меньше описания синтаксиса.docs.M continue.com/manual-this/no…

Пример оператора трубы

Вот несколько примеров распространенных операторов канала:

Сначала загрузите данные:

use test1

db.mycol.remove({})

document1=({name:'dogOne',age:1,tags:['animal','dog'],type:'dog',money:[{min:100},{norm:200},{big:300}]});

document2=({name:'catOne',age:3,tags:['animal','cat'],type:'cat',money:[{min:50},{norm:100},{big:200}]});

document3=({name:'catTwo',age:2,tags:['animal','cat'],type:'cat',money:[{min:20},{norm:50},{big:100}]});

document4=({name:'dogTwo',age:5,tags:['animal','dog'],type:'dog',money:[{min:300},{norm:500},{big:700}]});

document5=({name:'appleOne',age:0,tags:['fruit','apple'],type:'apple',money:[{min:10},{norm:12},{big:13}]});

document6=({name:'appleTwo',age:0,tags:['fruit','apple'],type:'apple',money:[{min:10},{norm:12},{big:13}]});

document7=({name:'pineapple',age:0,tags:['fruit','pineapple'],type:'pineapple',money:[{min:8},{norm:9},{big:10}]});

db.mycol.insert(document1)

db.mycol.insert(document2)

db.mycol.insert(document3)

db.mycol.insert(document4)

db.mycol.insert(document5)

db.mycol.insert(document6)

db.mycol.insert(document7)

Результат выполнения следующий:

/* 1 */

{

    "_id" : ObjectId("59187984f322c585a98664e2"),

    "name" : "dogOne",

    "age" : 1.0,

    "tags" : [ 

        "animal", 

        "dog"

    ],

    "type" : "dog",

    "money" : [ 

        {

            "min" : 100.0

        }, 

        {

            "norm" : 200.0

        }, 

        {

            "big" : 300.0

        }

    ]

}



/* 2 */

{

    "_id" : ObjectId("59187984f322c585a98664e3"),

    "name" : "catOne",

    "age" : 3.0,

    "tags" : [ 

        "animal", 

        "cat"

    ],

    "type" : "cat",

    "money" : [ 

        {

            "min" : 50.0

        }, 

        {

            "norm" : 100.0

        }, 

        {

            "big" : 200.0

        }

    ]

}



/* 3 */

{

    "_id" : ObjectId("59187984f322c585a98664e4"),

    "name" : "catTwo",

    "age" : 2.0,

    "tags" : [ 

        "animal", 

        "cat"

    ],

    "type" : "cat",

    "money" : [ 

        {

            "min" : 20.0

        }, 

        {

            "norm" : 50.0

        }, 

        {

            "big" : 100.0

        }

    ]

}



/* 4 */

{

    "_id" : ObjectId("59187984f322c585a98664e5"),

    "name" : "dogTwo",

    "age" : 5.0,

    "tags" : [ 

        "animal", 

        "dog"

    ],

    "type" : "dog",

    "money" : [ 

        {

            "min" : 300.0

        }, 

        {

            "norm" : 500.0

        }, 

        {

            "big" : 700.0

        }

    ]

}



/* 5 */

{

    "_id" : ObjectId("59187984f322c585a98664e6"),

    "name" : "appleOne",

    "age" : 0.0,

    "tags" : [ 

        "fruit", 

        "apple"

    ],

    "type" : "apple",

    "money" : [ 

        {

            "min" : 10.0

        }, 

        {

            "norm" : 12.0

        }, 

        {

            "big" : 13.0

        }

    ]

}



/* 6 */

{

    "_id" : ObjectId("59187984f322c585a98664e7"),

    "name" : "appleTwo",

    "age" : 0.0,

    "tags" : [ 

        "fruit", 

        "apple"

    ],

    "type" : "apple",

    "money" : [ 

        {

            "min" : 10.0

        }, 

        {

            "norm" : 12.0

        }, 

        {

            "big" : 13.0

        }

    ]

}



/* 7 */

{

    "_id" : ObjectId("59187984f322c585a98664e8"),

    "name" : "pineapple",

    "age" : 0.0,

    "tags" : [ 

        "fruit", 

        "pineapple"

    ],

    "type" : "pineapple",

    "money" : [ 

        {

            "min" : 8.0

        }, 

        {

            "norm" : 9.0

        }, 

        {

            "big" : 10.0

        }

    ]

}

1.$projectоператор и$matchоператор

$projectОператор канала используется для изменения документа в потоке,$matchОператор конвейера используется для фильтрации документов в потоке, пропуская на следующий этап только те документы, которые соответствуют условиям, а операция фильтрации не изменяет документы.$matchВ операции используются стандартные условия запроса mongodb.Для каждого входного документа, если условия соблюдены, документ выводится, в противном случае документ отбрасывается. Из-за ограничения памяти агрегатного конвейера при обработке больших файлов лучше сначала использовать оператор сопоставления для фильтрации, чтобы уменьшить использование памяти.

Предположим, мы хотим извлечь документы, чей минимум равен 100 в деньгах, и вывести только имя и минимум в денежном массиве, используйте$projectи$matchОператоры могут быть реализованы очень хорошо

use test1
db.mycol.aggregate(
    {$match:{'money.min':100}},
    {$project:{_id:0,name:'$name',minprice:'$money.min'}}
    )

Результат:

/* 1 */

{

    "name" : "dogOne",

    "minprice" : [ 

        100.0

    ]

}

Можно обнаружить, что после оператора проекта поля в документе изменены. Также обратите внимание, что для ссылок на объекты в массиве вам нужно использовать'$money.min'форма Уведомление:

  1. не может быть в$matchиспользуемый оператор$whereоператор выражения.
  2. $matchПостарайтесь появиться в начале конвейера, что может раннее фильтровать документы и ускорять агрегирование.
  3. если$matchПоявляется сверху, и индексы можно использовать для ускорения запросов.

2.$limit $skipоператор

$limitи$skipОператор используется для ограничения и пропуска соответствующих документов и имеет тот же эффект, что и методы limit и skip в find. Предположим, мы хотим извлечь документы с минимальной суммой менее 100 в деньгах и ограничить 3 документа, пропустить один документ и отобразить его снова. Скрипт

use test1

db.mycol.aggregate(

    {$match:{'money.min':{$lt:100}}},

    {$limit:3},

    {$skip:1},

    {$project:{_id:0,name:'$name',minprice:'$money.min'}}

    )

Результат:

/* 1 */

{

    "name" : "catTwo",

    "minprice" : [ 

        20.0

    ]

}



/* 2 */

{

    "name" : "appleOne",

    "minprice" : [ 

        10.0

    ]

}

Может найти результат для удовлетворения наших потребностей

3.$groupоператор

$groupОператоры используются для группировки данных.$groupКогда вы должны указать поле _id, оно также может содержать некоторые операторы выражений арифметического типа. Например, мы хотим классифицировать данные по типу и одновременно подсчитать сумму их возраста, Сценарий:

use test1

db.mycol.aggregate(

    {$group:{_id:'$type',sumage:{$sum:'$age'}}}

)

Результат:

/* 1 */

{

    "_id" : "pineapple",

    "sumage" : 0.0

}



/* 2 */

{

    "_id" : "cat",

    "sumage" : 5.0

}



/* 3 */

{

    "_id" : "apple",

    "sumage" : 0.0

}



/* 4 */

{

    "_id" : "dog",

    "sumage" : 6.0

}

Вы можете видеть, что данные отсортированы по кошкам, собакам, яблокам, ананасам и суммируются по возрасту. Уведомление:

  1. $groupВывод неупорядочен.
  2. $groupВ настоящее время операции выполняются в памяти, поэтому ее нельзя использовать для группировки большого количества документов.
  3. Домен для _id должен быть указан

4. $sortоператор

Оператор сортировки используется для сортировки данных, также 1 означает возрастание, -1 означает убывание Предположим, мы сортируем данные по возрасту, чтобы уменьшить количество строк вывода, мы используем группировку и пропускаем Сценарий:

use test1

db.mycol.aggregate(

    {$group:{_id:'$type',sumage:{$sum:'$age'}}},

    {$skip:1},

    {$sort:{sumage:1}}

)

Результат:

/* 1 */

{

    "_id" : "apple",

    "sumage" : 0.0

}



/* 2 */

{

    "_id" : "cat",

    "sumage" : 5.0

}



/* 3 */

{

    "_id" : "dog",

    "sumage" : 6.0

}

Уведомление:

  1. если$sortЕсли вы поместите его перед конвейером, вы можете использовать индекс для повышения эффективности.
  2. MongoDB оптимизирована для памяти, находится в конвейере, если$sortПоявляться в$limitдо,$sortтолько на фронт$limitоперацию над каждым документом, так что только предыдущий$limitдокументы, которые могут значительно сэкономить память
  3. $sortОперация выполняется в памяти, если занимаемая ею память превышает 10% физической памяти, программа выдаст ошибку

Наконец

Другие менее часто используемые операторы пока не описываются. Дополнительное внимание необходимо уделить требованиям памяти оператора.