2013-07-09 3 views
4

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

У меня есть следующие документы:

{ 
    "_id" : ObjectId("510a353929e16756d5000009"), 
    "skills" : [ 
    [ 
     "UserEmbed::Author::Skills::Copywriting", 
     "UserEmbed::Author::Skills::Proofreading", 
     "UserEmbed::Author::Skills::Proofreading", 
     "UserEmbed::Author::Skills::Translation", 
     "UserEmbed::Author::Skills::Translation", 
     "UserEmbed::Author::Skills::Translation" 
    ] 
    ] 
} 

Я хотел бы что-то вроде этого:

{ 
    "UserEmbed::Author::Skills::Copywriting": 1,  
    "UserEmbed::Author::Skills::Proofreading": 2, 
    "UserEmbed::Author::Skills::Translation": 3 
} 

Вот что у меня есть (первый $group, чтобы получить документ выше от моей первоначальной структуры документа):

aggregate([ { $group: { _id: "$_id", skills: { $addToSet : "$author_profile.skills._type" } } }, { $unwind : "$skills" }, { $group : { _id : "$skills", count: { $sum : 1 } } }]) 

Что возвращает что-то подобное (с ot ее документы):

{ 
    "_id" : [ 
    "UserEmbed::Author::Skills::Copywriting", 
    "UserEmbed::Author::Skills::Copywriting", 
    "UserEmbed::Author::Skills::Copywriting", 
    "UserEmbed::Author::Skills::Translation", 
    "UserEmbed::Author::Skills::Translation", 
    "UserEmbed::Author::Skills::Translation" 
    ], 
    "count" : 1 
} 

Кажется, что $group не работает должным образом. Я что-то неправильно понял?

ответ

6

Учитывая ваш документ содержит массив массивов, вам потребуется ввести второй $unwind для $skills:

db.so.aggregate([ 
    { $group: { _id: "$_id", 
     skills: { $addToSet : "$author_profile.skills._type" }}}, 
    { $unwind : "$skills" }, 
    { $unwind: "$skills" }, 
    { $group : { _id : "$skills", count: { $sum : 1 } } }]) 

Производит:

"result" : [ 
     { 
      "_id" : "UserEmbed::Author::Skills::Translation", 
      "count" : 3 
     }, 
     { 
      "_id" : "UserEmbed::Author::Skills::Proofreading", 
      "count" : 2 
     }, 
     { 
      "_id" : "UserEmbed::Author::Skills::Copywriting", 
      "count" : 1 
     } 
    ], 
"ok" : 1 
+0

Thx! не уделял достаточного внимания тому, что у меня были вложенные массивы ... –

+0

Знаете ли вы, как я мог бы группировать результаты по первому '_id'? –

+0

Я не понимаю, что вы имеете в виду ... группу, с помощью которой '_id'? – WiredPrairie

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