MongoDB – получить документы с максимальным атрибутом на группу в коллекции

Мои данные выглядят так:

session, age, firstName, lastName
1, 28, John, Doe
1, 21, Donna, Keren
2, 32, Jenna, Haze
2, 52, Tommy, Lee
..
..

Я хотел бы получить все строки, которые являются самыми большими (по возрасту) за сеанс. Итак, для приведенного выше ввода мой вывод будет выглядеть так:

sessionid, age, firstName, lastName
1, 28, John, Doe
2, 52, Tommy, Lee

потому что у Джона самый большой возраст в группе сеанса = 1, а у Томми самый большой возраст в группе сеанса = 2.

Мне нужно экспортировать результат в файл (csv), и он может содержать много записей.

Как я могу этого добиться?


person orcaman    schedule 17.09.2014    source источник


Ответы (2)


Вы можете попробовать приведенный ниже запрос агрегации, который использует атрибут max: http://docs.mongodb.org/manual/reference/operator/aggregation/max/

db.collection.aggregate([
   $group: {
       "_id": "$session",           
       "age": { $max: "$age" }
     },
   { $out : "max_age" }
])

Результаты должны быть выведены в новую коллекцию max_age, а затем вы можете сбросить ее в csv.

Примечание: это даст только сеанс и максимальный возраст и не вернет другие поля.

person Lalit Agarwal    schedule 17.09.2014
comment
Вы не прочитали вопрос. $max не режется на целые записи. - person Neil Lunn; 17.09.2014
comment
@NeilLunn Я не понимаю, что вы пытаетесь сказать, но надеюсь, вы прочитали примечание в моем ответе. - person Lalit Agarwal; 17.09.2014
comment
@orcaman Не может даже удаленно работать с тем, что вы просили. $max распространяет отдельный элемент из одного поля. Вы запросили возврат целой строки данных. Это не ваш ответ, и вы оказываете большую медвежью услугу будущим людям, принимая то, что не отвечает на ваш вопрос. - person Neil Lunn; 17.09.2014
comment
Вопрос и принятый ответ совершенно не связаны. - person Rohit; 12.01.2016
comment
Сколько отрицательных голосов, пока вы не удалите этот запутанный ответ из публичной сферы? - person Augie Gardner; 03.11.2016
comment
@AugieGardner Мне жаль слышать, что это сбивает с толку, и я был бы рад удалить его, но SO не позволяет удалить принятый ответ :( . - person Lalit Agarwal; 03.11.2016
comment
@LalitAgarwal а, понятно. Время начать комментировать ответы ОП, чтобы он выполнил свой гражданский долг. - person Augie Gardner; 05.11.2016

Агрегация MongoDB предлагает оператор $max, но в вашем случае вы хотите "всю" запись как есть. Таким образом, здесь уместно сделать $sort, а затем использовать оператор $first внутри $group заявление:

db.collection.aggregate([
    { "$sort": { "session": 1, "age": -1 } },
    { "$group": {
        "_id": "$session",
        "age": { "$first": "$age" },
        "firstName": { "$first" "$firstName" },
        "lastName": { "$first": "$lastName" }
    }}
])

Таким образом, «сортировка» получает правильный порядок, а «группировка» выбирает первое вхождение в ключе «группировки», где эти поля существуют.

В основном $first здесь, потому что $sort выполняется в обратном порядке. Вы также можете использовать $last в порядке возрастания. .

person Neil Lunn    schedule 17.09.2014
comment
Ваше здоровье. Я пытался использовать это, но по какой-то причине я получаю только один документ. см. мой вопрос (я отредактировал его, чтобы добавить код). - person orcaman; 17.09.2014
comment
@orcaman Вы меняете условия в своем вопросе. Поле, которое вы документируете, называется сеансом или это идентификатор сеанса. Посмотрите на концепции примеров кода, а не полагайтесь на вырезание и вставку. - person Neil Lunn; 17.09.2014
comment
Привет, Нил, я вообще не вырезал и не вставлял - моя фактическая структура совершенно другая (насколько я могу понять, опечатка сеанса или идентификатора сеанса не имеет отношения к ошибке). Пожалуйста, просмотрите мой вопрос выше (я отредактировал его, чтобы объяснить). - person orcaman; 17.09.2014