2015-02-02 3 views
1

Допустим, у меня есть коллекция книг, как это:Множественные группа агрегат в MongoDB

{author:"john", category:"action", title:"foobar200"}, 
{author:"peter", category:"scifi" , title:"42test"}, 
{author:"peter", category:"novel", title:"whatever_t"}, 
{author:"jane", category:"novel", title:"the return"}, 
{author:"john", category:"action", title:"extreme test"}, 
{author:"peter", category:"scifi", title:"such title"}, 
{author:"jane", category:"action", title:"super book "} 

Я хочу, чтобы сделать запрос, аналогичный:
SELECT author,category, count(*) FROM books GROUP BY category, author
==> Результат:

john -> action -> 2 
john -> novel -> 0 
john -> scifi -> 0 
jane -> action -> 1 
etc... 

ближайший я был к решению:

db.books.aggregate(
     { 
     $match: {category:"action"} 
     }, 
     { 
     $group: { _id: '$author', result: { $sum: 1 } } 
     } 
); 

==> результат

{ "_id" : "jane", "result" : 1 } 
{ "_id" : "john", "result" : 2 } 
{ "_id" : "peter", "result" : 0 } 

Но я не могу понять, как выполнить вторую «группу по» категориям.
Каков наилучший способ сделать это?

Благодаря

ответ

0

Вы можете включать в себя несколько полей в _id используется $group для обеспечения многопрофильного группировки:

db.books.aggregate([ 
    {$group: { 
     _id: {category: '$category', author: '$author'}, 
     result: {$sum: 1} 
    }} 
]) 

Результат:

{ 
    "_id" : { 
     "category" : "action", 
     "author" : "jane" 
    }, 
    "result" : 1 
}, 
{ 
    "_id" : { 
     "category" : "novel", 
     "author" : "jane" 
    }, 
    "result" : 1 
}, 
{ 
    "_id" : { 
     "category" : "novel", 
     "author" : "peter" 
    }, 
    "result" : 1 
}, 
{ 
    "_id" : { 
     "category" : "scifi", 
     "author" : "peter" 
    }, 
    "result" : 2 
}, 
{ 
    "_id" : { 
     "category" : "action", 
     "author" : "john" 
    }, 
    "result" : 2 
} 
+0

Вы можете использовать $ проект дальнейшей формы результаты, подобные OP: > 'db.books.aggregate ([{$ group: {_id: {category: '$ category', author: '$ author'}, result: {$ sum: 1}}}, {$ project: {_id: "$ _id.author", result: "$ result"}}]) –

+0

Вы знаете, как я могу проецировать: {autor: 'john', list: {action: 2, scifi: 3, novel: 0}}? –

+0

@AbelChalier Лучше всего опубликовать это как новый вопрос. – JohnnyHK