Как мне сделать разбивку по многоуровневому счету с помощью Aggregation в mon go DB? - PullRequest
1 голос
/ 29 марта 2020

У меня есть документ следующей структуры.

{
  name: "John Doe",
  City : "OK",
  Prepaid: "Y"
},
{
  name: "Jane Doe",
  City : "CA",
  Prepaid: "N"
},
{
  name: "Jule Doe",
  City : "OK",
  Prepaid: "N"
},
{
  name: "Jake Doe",
  City : "OK",
  Prepaid: "Y"
}

Я хотел бы сгруппировать это сначала по городу, а затем по предоплате и получить индивидуальное количество для каждого типа предоплаты. Нечто похожее на это.

{
  City : OK
  Count : {
    "filter": prepaid,
    "count": {
      Y : 2
      N: 1
    }
  }
}

{
  City : CA
  Count : {
    "filter": prepaid,
    "count": {
      Y : 0
      N: 1
    }
  }
}

Я попытался выполнить агрегирование по нескольким полям, и это дает мне общее количество документов, а не разбивки.

Вот что я попробовал для моего конвейера агрегации:

db.collection.aggregate([
    {$match:matchquery
    },{$group:{_id:{city: '$city', prepaid: '$prepaid' }, count:{$sum:1}
    }}
])

1 Ответ

1 голос
/ 29 марта 2020

Вы можете запустить $ group дважды, чтобы сосчитать сначала prepaid, а затем вы можете применить $ arrayToObject , чтобы получить Y/N в качестве ключей объекта:

db.collection.aggregate([
    {
        $group: {
            _id: { city: "$City", prepaid: "$Prepaid" },
            total: { $sum: 1 }
        }
    },
    {
        $grop: {
            _id: "$_id.city",
            Count: {
                $push: {
                    k: "$_id.prepaid", v: "$total"
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            city: "$_id",
            Count: { $mergeObjects: [ { filter: "prepaid" }, { count: { $arrayToObject: "$Count" } } ] }
        }
    }
])

Пн go Детская площадка

...