Оператор этапов агрегации MongoDB - $ group
Описание
Оператор групповых этапов MongoDB $ группирует документы по некоторому указанному выражению и группирует документ для каждой отдельной группировки. Поле _id в выходных документах содержит отдельную группу по ключу. Выходные документы также могут содержать вычисляемые поля, которые содержат значения некоторых выражений аккумулятора, сгруппированных по полю _id в $ group. Этот оператор не заказывает свои выходные документы.
Синтаксис:
{$ group: {_id: <выражение>, <поле1>: {<аккумулятор1>: <выражение1>}, ...}}
Нужно помнить:
- Поле _id является обязательным; Значение _id может быть указано как ноль для расчета накопленных значений для всех входных документов в целом.
- Остальные поля, которые могут быть вычислены, являются необязательными и вычисляются с использованием операторов <аккумулятор>.
- Выражения _id и <аккумулятор> могут принимать любое допустимое выражение.
Образец инвойса
{
"_id" : 1,
"item" : "doz",
"qty" : 20,
"rate" : 10,
"inv_date" : "02/02/2014"
}
{
"_id" : 2,
"item" : "sam",
"qty" : 15,
"rate" : 8,
"inv_date" : "05/12/2014"
}
{
"_id" : 3,
"item" : "amp",
"qty" : 25,
"rate" : 8,
"inv_date" : "07/02/2014"
}
{
"_id" : 4,
"item" : "doz",
"qty" : 20,
"rate" : 10,
"inv_date" : "02/02/2014"
}
{
"_id" : 5,
"item" : "amp",
"qty" : 10,
"rate" : 8,
"inv_date" : "05/12/2014"
}
{
"_id" : 6,
"item" : "doz",
"qty" : 30,
"rate" : 10,
"inv_date" : "13/04/2014"
}
{
"_id" : 7,
"item" : "sam",
"qty" : 15,
"rate" : 8,
"inv_date" : "05/12/2014"
}
{
"_id" : null,
"item" : "mks",
"qty" : 10,
"rate" : 20,
"inv_date" : "17/12/2014"
}
Пример-1: $ group
В следующем примере группируется по полю даты счета-фактуры и отображается общая стоимость, среднее количество и номер счета-фактуры за ту же дату.
db.invoice.aggregate(
[
{
$group : {_id : "$inv_date",
totalCost: { $sum: { $multiply: [ "$rate", "$qty" ] } },
avgQty: { $avg: "$qty" },
count: { $sum: 1 }
}
}
]
).pretty();
Выход:
{"_id": "17/12/2014", "totalCost": 200, "avgQty": 10, "count": 1} {"_id": "13/04/2014", "totalCost": 300, "avgQty": 30, "count": 1} { "_id": "05.12.2014", «TotalCost»: 320, "avgQty": 13.333333333333334, "считать": 3 } {"_id": "07/07/2014", "totalCost": 200, "avgQty": 25, "count": 1} {"_id": "02.02.2014", "totalCost": 400, "avgQty": 20, "count": 2}
Здесь из результата видно, что документ для даты счета-фактуры поля сгруппирован и показывает общую стоимость, среднюю квоту и количество счетов, выставленных за эту дату.
Пример 2: $ group на нескольких ключах
В следующем примере группируются по дате выставления счета, а затем по полю позиции и отображаются общая стоимость, среднее количество и количество накладных за ту же дату.
db.invoice.aggregate(
[
{
$group : {_id : {inv_date : "$inv_date",item : "$item"},
totalCost: { $sum: { $multiply: [ "$rate", "$qty" ] } },
avgQty: { $avg: "$qty" },
count: { $sum: 1 }
}
}
]
).pretty();
Выход :
{ "_Я бы" : { "inv_date": "17.12.2014", "item": "mks" }, «TotalCost»: 200, "avgQty": 10, "считать": 1 } { "_Я бы" : { "inv_date": "13/04/2014", "item": "doz" }, "totalCost": 300, "avgQty": 30, "считать": 1 } { "_Я бы" : { "inv_date": "05.12.2014", "item": "amp" }, "totalCost": 80, "avgQty": 10, "считать": 1 } { "_Я бы" : { "inv_date": "07/02/2014", "item": "amp" }, «TotalCost»: 200, "avgQty": 25, "считать": 1 } { "_Я бы" : { "inv_date": "05.12.2014", "элемент": "Сэм" }, «TotalCost»: 240, "avgQty": 15, "считать": 2 } { "_Я бы" : { "inv_date": "02.02.2014", "item": "doz" }, "totalCost": 400, "avgQty": 20, "считать": 2 }
Здесь из вышеприведенного результата видно, что документ на дату выставления счета 05.12.2014 и 02.02.2014 имеет одинаковую позицию, комбинация этих двух полей образует группу.
Пример-3: $ group для нескольких ключей с $ match
В следующем примере группируются по дате выставления счета, а затем по полю позиции и отображаются общая стоимость, среднее количество и количество накладных в одну и ту же дату для тех документов, датой выставления которых является 05.12.2014.
db.invoice.aggregate(
[
{
$match : {inv_date : "05/12/2014"}
},
{
$group : {_id : {inv_date : "$inv_date",item : "$item"},
totalCost: { $sum: { $multiply: [ "$rate", "$qty" ] } },
avgQty: { $avg: "$qty" },
count: { $sum: 1 }
}
}
]
).pretty();
Выход :
{ "_Я бы" : { "inv_date": "05.12.2014", "item": "amp" }, "totalCost": 80, "avgQty": 10, "считать": 1 } { "_Я бы" : { "inv_date": "05.12.2014", "элемент": "Сэм" }, «TotalCost»: 240, "avgQty": 15, "считать": 2 }
Здесь из вышеприведенного результата видно, что документ на дату счета-фактуры 05/12/2014 имеет три счета-фактуры, но с одной и той же комбинацией позиций создали группу.
Пример 4: значения группы $
Следующая операция агрегации использует этап $ group для группировки документов по элементу для получения различных значений элемента:
> db.invoice.aggregate( [ { $group : { _id : "$item" } } ] ).pretty();
Выход :
> db.invoice.aggregate ([{$ group: {_id: "$ item"}}]) .pretty (); {"_id": "mks"} {"_id": "amp"} {"_id": "sam"} {"_id": "doz"}
Пример 5: $ group
В следующей операции агрегирования используется этап $ group для группировки даты выставления счетов документов по элементу.
db.invoice.aggregate(
[
{ $group : { _id : "$item", invoiceDate: { $push: "$inv_date" } } }
]
).pretty();
Выход :
{"_id": "mks", "invoiceDate": ["17/12/2014"]} {"_id": "amp", "invoiceDate": ["02.07.2014", "12.12.2014"]} {"_id": "sam", "invoiceDate": ["12/12/2014", "12/12/2014"]} { "_id": "doz", "Дата счета" : [ "02/02/2014", "02/02/2014", "13/04/2014" ] }
Предыдущая: $ размотка
Далее: $ out
Новый контент: Composer: менеджер зависимостей для PHP , R программирования