MongoDB группировка и максимальный пункт? - PullRequest
1 голос
/ 18 апреля 2020

Я не могу понять, как написать этот запрос в MongoDB!

Мне нужно вернуть строки из запроса, где максимальное значение "Revision" - это строка, возвращаемая для элемента

У меня есть две части:

  1. Возврат отсчета без фактического получения данных.
  2. Возврат всех данных (не обязательно в порядке по столбцу A, но будет полезно) на основе группировки.

Вот примерный набор (В наших реальных данных у нас ~ 40 столбцов и потенциально миллионы строк):

    A       B       C       D       Revision
    --------+-------+-------+-------+------------
    Item1   100     200     300     1
    Item1   111     222     333     2
    Item2   200     500     800     1
    Item2   222     555     888     2
    Item2   223     556     889     3
    Item3   300     600     900     1
    Item4   400     700     1000    1

Что я необходимо вернуть:

  1. Возвращенное количество: 4
  2. Возвращенные данные:
    A       B       C       D       Revision
    --------+-------+-------+-------+--------
    Item1   111     222     333     2
    Item2   223     556     889     3
    Item3   300     600     900     1
    Item4   400     700     1000    1
    

Я пытался так много комбинаций или $group и $count и даже пытался использовать SQL для инструментов перевода запросов MongoDB, но, похоже, не может заставить его работать.

Пожалуйста, помогите и заранее спасибо !!

1 Ответ

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

Попробуйте запрос ниже:

db.collection.aggregate([
  {
    $group: {
      _id: "$A",
      A: { $first: "$A" },
      B: { $max: "$B" },
      C: { $max: "$C" },
      D: { $max: "$D" },
      Revision: { $max: "$Revision" },
    }
  },
  {
    $project: { _id: 0 },
  },
  {
    $group: {
      _id: "",
      count: { $sum: 1 },
      data: { $push: "$$ROOT" }
    }
  }
]);

Тест: mongoplayground

Таким образом, в поле data у вас будут актуальные документы где в качестве количества представлены номера уникальных 'A' в коллекции.

Иначе, если вы не хотите, чтобы результат был таким, вы можете просто попробовать выполнить следующий запрос:

db.collection.aggregate([
  {
    $group: {
      _id: "$A",
      A: { $first: "$A" },
      B: { $max: "$B" },
      C: { $max: "$C" },
      D: { $max: "$D" },
      Revision: { $max: "$Revision" },
    }
  },
  {
    $project: { _id: 0 },
  }
])

Тест: mongoplayground

Возвращается массив объектов, поскольку агрегация всегда возвращает курсор, который будет преобразован в массив в коде, тогда вы можете просто наберите .length в массиве, чтобы получить общее количество, вместо использования второго этапа $group в первом запросе, чтобы получить только общее количество, это еще один вариант.

...