2016-10-05 3 views
0

Я пытаюсь получить первую из каждой группы, тогда мне нужно отсортировать результаты. Я достиг первой части, но не смог сортировать результат. Вот то, что я попыталсяРезультаты сортировки группы mongodb

образца данных

{ 
    "_id" : ObjectId("57f549e1831529409b000001"),"name" : "book1","author" : "abc","revision" : 1.0, 
    "published_on" : ISODate("2016-10-05T18:43:45.902Z"),"publisher" : "newpublisher" 
}, 
{ 
    "_id" : ObjectId("57f54a4483152940ad000001"),"name" : "book1","author" : "a1","revision" : 1.1, 
    "published_on" : ISODate("2016-10-05T18:45:24.436Z"), "publisher" : "newpublisher" 
}, 
{ 
    "_id" : ObjectId("57f54baa83152940c3000001"), "name" : "oldbook", "author" : "alice","revision" : 1.0, 
    "published_on" : ISODate("2016-10-05T18:51:22.484Z"),"publisher" : "newpublisher" 
}, 
{ 
    "_id" : ObjectId("57f54c4983152940c3000002"),"name" : "artoflearning","author" : "mike","revision" : 1.0, 
    "published_on" : ISODate("2016-10-05T18:54:01.585Z"),"publisher" : "oldpublisher" 
}, 
{ 
    "_id" : ObjectId("57f54c5883152940c3000003"),"name" : "artoflearning","author" : "mike","revision" : 1.1, 
    "published_on" : ISODate("2016-10-05T18:54:16.568Z"),"publisher" : "oldpublisher" 
}, 
{ "_id" : ObjectId("57f54c6583152940c3000004"),"name" : "artoflearning","author" : "mike","revision" : 1.2, 
    "published_on" : ISODate("2016-10-05T18:54:29.848Z"),"publisher" : "oldpublisher" 
}, 
{ "_id" : ObjectId("57f5513f8315294116000000"),"name" : "learning","author" : "mike","revision" : 2.0, 
    "published_on" : ISODate("2016-10-05T19:15:11.342Z"),"publisher" : "newpublisher" 
} 

Я получаю последнюю версию (сортировка по пересмотру в Desc) группу по имени для данного издателя. Я использовал этот запрос для достижения

Book.collection.aggregate([ 
{'$match' => {"publisher"=>"newpublisher"}}, 
{'$sort' => {'revision' => -1}}, 
{'$group' => {'_id' => '$name', 
      'revision' => {'$first' => '$revision'}, 
      'id' => {'$first' => '$_id'}, 
      'name' => {'$first' => '$name'}, 
      'published_on' => {'$first' => '$published_on'}, 
      'publisher' => {'$first' => '$publisher'} 
      } 
}, 
{'$project' => {'_id' => '$id', 
       'revision' => '$revision', 
       'name' => '$name', 
       'published_on' => '$published_on', 
       'publisher' => '$publisher' 
       } 
}, 
{'$skip' => 1}, 
{ '$limit' => 10 } 
]) 

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

{"_id"=>{"$oid"=>"57f54a4483152940ad000001"}, "revision"=>1.1, "name"=>"book1", "published_on"=>"2016-10-05T18:45:24.436Z", "publisher"=>"newpublisher"}, 
{"_id"=>{"$oid"=>"57f5513f8315294116000000"}, "revision"=>2.0, "name"=>"learning", "published_on"=>"2016-10-05T19:15:11.342Z", "publisher"=>"newpublisher"} 

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

Пожалуйста посоветуйте

+0

добавляет '{'$ sort' => {'name' => 1}}' в конце вашего конвейера не работает? – Rafael

+0

@ Рафаэль, да, это сработало. Как получить общее количество сгруппированных результатов – user2624242

ответ

1

Вы не сказали, что ошибка, вы получаете, что помогло бы. Но вы сказали

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

и тем, что я понимаю, что вы добавили sort после limit. Если вы сделали это, он сортирует только пропущенные и ограниченные результаты для того, чтобы отсортировать все результаты, которые вы должны назвать своего рода, прежде чем пропустить и ограничивая их, как:

Book.collection.aggregate([ 
    {'$match' => {"publisher"=>"newpublisher"}}, 
    {'$sort' => {'revision' => -1}}, 
    {'$group' => {'_id' => '$name', 
       'revision' => {'$first' => '$revision'}, 
       'id' => {'$first' => '$_id'}, 
       'name' => {'$first' => '$name'}, 
       'published_on' => {'$first' => '$published_on'}, 
       'publisher' => {'$first' => '$publisher'} 
       } 
    }, 
    {'$project' => {'_id' => '$id', 
        'revision' => '$revision', 
        'name' => '$name', 
        'published_on' => '$published_on', 
        'publisher' => '$publisher' 
       } 
    }, 
    {'$sort' => {'name' => 1}}, 
    {'$skip' => 1}, 
    {'$limit' => 10 } 
]) 

Я добавил документы, размещенные в коллекции и запустили этот запрос, и это результат

[ { _id: 57f5513f8315294116000000, 
    revision: 2, 
    name: 'learning', 
    published_on: Wed Oct 05 2016 16:15:11 GMT-0300 (BRT), 
    publisher: 'newpublisher' }, 
    { _id: 57f54baa83152940c3000001, 
    revision: 1, 
    name: 'oldbook', 
    published_on: Wed Oct 05 2016 15:51:22 GMT-0300 (BRT), 
    publisher: 'newpublisher' } ] 

и отсортировано по published_on:

{'$sort': {'published_on': 1}}

[ { _id: 57f54baa83152940c3000001, 
    revision: 1, 
    name: 'oldbook', 
    published_on: Wed Oct 05 2016 15:51:22 GMT-0300 (BRT), 
    publisher: 'newpublisher' }, 
    { _id: 57f5513f8315294116000000, 
    revision: 2, 
    name: 'learning', 
    published_on: Wed Oct 05 2016 16:15:11 GMT-0300 (BRT), 
    publisher: 'newpublisher' } ] 
+0

Спасибо, это правильно – user2624242

+0

Как получить общее количество сгруппированных результатов, которые будут отображаться вместе с выходом – user2624242

+0

Добавьте это к групповому объекту: '' count '=> {'$ sum' => 1} ' –

Смежные вопросы