MongoDB: соответствие и группа с максимальной агрегацией - PullRequest
0 голосов
/ 24 октября 2019

Я хочу показать возраст смерти всего демократического президента, который умирает самым старшим.

Мой запрос:

db.PRESIDENT.aggregate([
  { $match: { PARTY: "Democratic" } },
  { $group: { "_id": null, "Maximum_Death_Age": { $max: "$DEATH_AGE" } } }
]);

Вывод Я получаю:

{ "_id" : null, "Maximum_Death_Age" : "" }

Коллекция:

изображение

Выходное изображение: введите описание изображения здесь

1 Ответ

0 голосов
/ 24 октября 2019

Как вы упомянули в комментариях. Так как DEATH_AGE содержит пустую строку "", он не справляется с операцией сравнения $max и ее выводом.

Примечание: Если бы поле DEATH_AGE было пустым (не там)) или как null даст ожидаемые результаты.

Исправление может состоять в том, чтобы просто отфильтровать не погибших президентов на стадии матча

Запрос:

db.collection.aggregate([
  {
    $match: {
      "PARTY": "Democratic",
      "DEATH_AGE": {
        "$exists": true,
        "$ne": ""
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "Maximum_Death_Age": {
        "$max": "$DEATH_AGE"
      }
    }
  }
])

Альтернативный запрос: (Если вы не обязаны использовать $max с $group) Сортировка по DEATH_AGE по убыванию и выбор первого $limit

db.collection.aggregate([
  {
    $match: {
      "PARTY": "Democratic",
      "DEATH_AGE": {
        "$exists": true,
        "$ne": ""
      }
    }
  },
  {
    $sort: {
      "DEATH_AGE": -1
    }
  },
  {
    $limit: 1
  }
]);

Приведенный выше запрос также может быть оптимизирован, поскольку в документации говорится:

Когда сортировка $ предшествует пределу $, и нет промежуточных этапов, которые изменяютПо количеству документов оптимизатор может объединить лимит $ в $ sort. Это позволяет операции $ sort поддерживать только верхние n результатов по мере ее продвижения, где n - указанное ограничение, и гарантирует, что MongoDB необходимо хранить только n элементов в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...