Как получить весь документ после операции $ group и $ max -Mongodb? - PullRequest
2 голосов
/ 20 октября 2019

Вот как выглядит моя коллекция:

{"_id": 1, "price_history": [{date: 10-01-19, price: 10}, {date: 10-05-19, price: 15}...]...}
{"_id": 2, "price_history": [{date: 10-01-19, price: 12}, {date: 10-05-19, price: 14}...]...}
{"_id": 3, "price_history": [{date: 10-01-19, price: 17}, {date: 10-05-19, price: 25}...]...}
{"_id": 4, "price_history": [{date: 10-01-19, price: 10}, {date: 10-05-19, price: 16}...]...}

(Даты - это все объекты дат, просто написали их так, чтобы их было проще читать)

Так что я могу получить максимумцена из массива "price_history", но я также хочу получить тот объект даты, который совпадает с этой максимальной ценой.

Вот то, что у меня есть, я удалил много несущественных вещей в вопросе.

{
    $group: {
        '_id': 'stats', 
        'price_history_stats': {
            $push: {
                '_id': '$_id',
                'highest': {
                    $max: '$price_history.price'
                }
            }
        }
    }
}

Вывод, который я получаю:

{
    '_id': 'stats',
    'price_history_stats': [
                {'_id': 1, 'highest': 15},
                {'_id': 1, 'highest': 14},
                {'_id': 1, 'highest': 25},
                {'_id': 1, 'highest': 16}
                ]
}

Но я ищу способ добиться этого с помощью дат:

{
    '_id': 'stats',
    'price_history_stats': [
                {'_id': 1, 'highest': 15, date: 10-05-10},
                {'_id': 1, 'highest': 14, date: 10-05-10},
                {'_id': 1, 'highest': 25, date: 10-05-10},
                {'_id': 1, 'highest': 16, date: 10-05-10}
                ]
}

(Извините за любые опечатки, я переформатировал много материала для вопроса)

Любая помощь будет оценена. Спасибо

1 Ответ

2 голосов
/ 20 октября 2019

Если целью является найти максимальный документ для группы на основе price, то сочетание $sort сначала на price, затем $group с $last выдаст аналогичный вывод.

Запрос: Ссылка

db.collection.aggregate([
  {
    $unwind: "$price_history"
  },
  {
    $sort: {
      "price_history.price": 1
    }
  },
  {
    $group: {
      _id: "$_id",
      max_price_doc: {
        $last: "$price_history"
      }
    }
  }
]);

Выход: (Демо)

[
  {
    "_id": 1,
    "max_price_doc": {
      "date": "10 - 05 - 19",
      "price": 15
    }
  },
  {
    "_id": 4,
    "max_price_doc": {
      "date": "10 - 05 - 19",
      "price": 16
    }
  },
  {
    "_id": 3,
    "max_price_doc": {
      "date": "10 - 05 - 19",
      "price": 25
    }
  },
  {
    "_id": 2,
    "max_price_doc": {
      "date": "10 - 05 - 19",
      "price": 14
    }
  }
]
...