Агрегация с использованием $ group для получения первого элемента (с условием) - PullRequest
1 голос
/ 28 апреля 2020

Предположим, у меня есть следующее:

  {'start': '2011-01-29',
  'target': 0.0,
  'cat': [0, 0, 0, 0, 0],
  'state': 0},

  {'start': '2011-01-25',
  'target': 1.0,
  'cat': [0, 1, 0, 3, 0],
  'state': 0},

  {'start': '2011-01-29',
  'target': 1.0,
  'cat': [0, 0, 0, 0, 0],
  'state': 0}

Мне нужно сгруппировать эту коллекцию по штатам, чтобы получить:

  • Самая старая start дата
  • Сумма Target
  • Массив cat, где самая старая дата.

Использование:

{ 
            "$group": {
              "_id": {  "state": "$state",
                     }, 
              "sum": { "$sum": "$target" },
              "start": { "$min": "$start" },
              "cat": {"$first": "$cat"}

            } 
      }

Я могу получить:

  • Самая старая start дата

  • Сумма Target

Однако я могу Не получается:

  • Массив cat, где самая старая дата.

Мой желаемый вывод:

  {'start': '2011-01-25',
  'target': 2.0,
  'cat': [0, 1, 0, 3, 0],
  'state': 0},

1 Ответ

1 голос
/ 28 апреля 2020

Вы можете оставить оба поля внутри одного $min выражения.

{
  "$group": {
    "_id": { "state": "$state" },
    "sum": { "$sum": "$target" },
    "cat": {
      "$min": {
        "start": "$start",
        "cat": "$cat"
      }
    }
  }
},
{ "$replaceRoot": {
  "newRoot": {
    "$mergeObjects": [
      "$$ROOT",
      { "start": "$cat.start", "cat": "$cat.cat" }
    ]
  }
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...