MongoDB Агрегировать по подгруппе уже сгруппировать по дате - PullRequest
0 голосов
/ 27 марта 2020

У меня есть коллекция mon go, которая содержит проекты и представлена ​​следующим образом (небольшая выборка):

{
    {
        "_id" : ObjectId("5c615f9141d6ec562be9fd4d"),
        "title" : "Project1",
        "_created" : ISODate("2019-02-11T11:42:09Z"),
        "org" : [
            "ORG1"
        ]
    }
    {
        "_id" : ObjectId("5cf4ec11362a5f02b74effd3"),
        "title" : "Project2",
        "org" : [
            "ORG2"
        ],
        "_created" : ISODate("2018-06-03T09:44:49Z")
    }
    {
        "_id" : ObjectId("5d0362eb362a5f488a315508"),
        "title" : "Another Project",
        "org" : [
            "ORG3"
        ],
        "_created" : ISODate("2019-06-14T09:03:39Z")
    }
    {
        "_id" : ObjectId("5d0362eb362a5f488a315508"),
        "title" : "Multi Org Project",
        "org" : [
            "ORG1",
            "ORG3"
        ],
        "_created" : ISODate("2018-06-14T09:03:39Z")
    }
}

То, что я хотел бы сделать, это узнать по временному интервалу (например, $ day / $ month / $ year) номер проекта, созданного в каждой организации (org).

Я изо всех сил пытаюсь сделать это в мон go агрегации.

Мне удается это сделать:

  • Подсчет количества проектов, созданных за год
db.projects.aggregate({$group:{_id:{$year: "$_created"}, project:{$sum:1}}}) 
  • Подсчет проектов, созданных Org
db.projects.aggregate([{$unwind:"$org"}, {$group:{_id: "$org", project: {$sum:1}}}])

Но как объединить оба? Я не хочу форсировать какой-либо формат результатов, но он будет выглядеть примерно так:

{
    2017: {
        "ORG1": 12,
        "ORG2": 3,
    },
    2018...
}

Я нашел много вопросов о MongoDB Aggragation Framework, но я до сих пор не понимаю.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 27 марта 2020

размотайте массив org, затем дважды сгруппируйте для достижения этой цели:

db.collection.aggregate([
  {
    $unwind: "$org"
  },
  {
    $group: {
      _id: {
        year: {
          $year: "$_created"
        },
        org: "$org"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id.year",
      res: {
        $addToSet: {
          org: "$_id.org",
          count: "$count"
        }
      }
    }
  },
])

Будет вывод

[
  {
    "_id": 2018,
    "res": [
      {
        "count": 1,
        "org": "ORG1"
      },
      {
        "count": 1,
        "org": "ORG3"
      },
      {
        "count": 2,
        "org": "ORG2"
      }
    ]
  },
  {
    "_id": 2019,
    "res": [
      {
        "count": 1,
        "org": "ORG2"
      },
      {
        "count": 1,
        "org": "ORG1"
      },
      {
        "count": 1,
        "org": "ORG3"
      }
    ]
  }
]

При необходимости вы можете добавить дополнительные этапы для изменения формы документов.

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

...