концепция трубопровода
Сначала введем понятие конвейера.При использовании многопоточности POSIX определяется важный метод конвейера, который называется «конвейер» или «конвейер». Этот метод позволяет последовательно выполнять данные группой потоков. следует:
Чтобы понять с помощью объектно-ориентированного мышления, весь конвейер можно понимать как конвейер передачи данных; каждый рабочий поток в конвейере можно понимать как рабочую стадию всего конвейера, а взаимодействие между этими рабочими потоками — это Ring-to. -звенеть. Рабочий поток, который находится ближе к входному порту, является стадией этапа работы с более ранним таймингом, и результат его работы повлияет на результат работы следующего этапа (этапа) рабочего потока, то есть следующий этап зависит от вывода предыдущий этап и предыдущий этап Выход этапа становится входом этого этапа. Это также общая черта трубопроводов.трубы в монгодб
В версии 2.2 mongodb представила новую функцию фреймворка агрегации (aggregate framework), которая представляет собой новый фреймворк для агрегации, его концепция аналогична конвейеру обработки данных, каждый документ проходит через конвейер, состоящий из нескольких узлов, каждый узел довольно Стадия в конвейере имеет свои функции (группировка, фильтрация и т.д.).После обработки документа конвейером, наконец, выводится соответствующий результат.Основных функций конвейера две:
- «Фильтровать» документы, чтобы отфильтровать подходящие документы
- «Преобразовать» документ, чтобы изменить форму вывода документа
Другие функции включают группировку и сортировку по указанному полю. И на каждом этапе вы также можете использовать операторы выражений для вычисления средних значений, объединения строк и других связанных операций. 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'
форма
Уведомление:
- не может быть в
$match
используемый оператор$where
оператор выражения. -
$match
Постарайтесь появиться в начале конвейера, что может раннее фильтровать документы и ускорять агрегирование. - если
$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
}
Вы можете видеть, что данные отсортированы по кошкам, собакам, яблокам, ананасам и суммируются по возрасту. Уведомление:
-
$group
Вывод неупорядочен. -
$group
В настоящее время операции выполняются в памяти, поэтому ее нельзя использовать для группировки большого количества документов. - Домен для _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
}
Уведомление:
- если
$sort
Если вы поместите его перед конвейером, вы можете использовать индекс для повышения эффективности. - MongoDB оптимизирована для памяти, находится в конвейере, если
$sort
Появляться в$limit
до,$sort
только на фронт$limit
операцию над каждым документом, так что только предыдущий$limit
документы, которые могут значительно сэкономить память -
$sort
Операция выполняется в памяти, если занимаемая ею память превышает 10% физической памяти, программа выдаст ошибку
Наконец
Другие менее часто используемые операторы пока не описываются. Дополнительное внимание необходимо уделить требованиям памяти оператора.