кодесурса
«MongoDB

Оператор этапов агрегации MongoDB - $ group

script1adsense2code
script1adsense3code

Описание

Оператор групповых этапов 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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code