Grupo MongoDB por elementos internos de la matriz

Tengo una lista de artículos, y cada uno de ellos tiene una propiedad de matriz que enumera varias personas mencionadas en ellos:

_id: { $oid: "52b632a9e4f2ba13c82ccd23" }, providerName: "The Guardian", url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm", subject: "The Waterboys – review", class_artist: [ "paul mccartney" ] 

He intentado (sin éxito) obtener una lista de todos los artistas individuales ( class_artist ), según la cantidad de artículos en los que han sido etiquetados en los últimos 7 días.

He llegado tan lejos como:

 var date = new Date(); date.setDate(date.getDate() - 7); db.articles.group({ key: { class_artist: 1 }, cond: { class_date: { $gt: date } }, reduce: function ( curr, result ) { result.cnt++; }, initial: { cnt : 0 } }).sort({cnt: -1}); 

Pero, lamentablemente, no los cuenta en función de los valores de matriz individuales, sino de las composiciones de matriz (es decir, listas de artistas).

Intenté usar la función $unwind , pero no he podido hacer que funcione.

¿Qué marco estás usando? Esto no es un shell de MongoDB y parece una envoltura extraña alrededor de MapReduce . En ese caso $ unwind no estaría disponible, y lo necesita para el usuario en el marco de agregación . Esto es lo que quieres en el caparazón de mongo:

 db.articles.aggregate([ {$match: { class_date: { $gte: date } } }, {$project: { _id: 0, class_artist: 1 } }, {$unwind: "$class_artist" }, {$group: { _id: "$class_artist", tags: { $sum: 1 } }}, {$project: { _id: 0,class_artist: "$_id", tags: 1 } }, {$sort: { tags: -1 } } ]) 

Tan eficientemente:

  1. Filtrar por fecha porque ya ha establecido una var para los últimos 7 días
  2. Proyecte solo el (los) campo (s) que necesitamos (¡solo necesitamos uno! }
  3. Desenrolle la matriz para que ahora tengamos un registro de cada elemento de la matriz en cada documento
  4. Grupo sobre el artista a partir de los documentos ampliados
  5. Proyecte en un formato de documento que puede usar como grupo mezclado con _id
  6. Ordene los resultados en orden inverso para ver primero la etiqueta etiquetada

Y lo bueno de la agregación es que puedes construir gradualmente esas etapas para ver qué está sucediendo.

Agite y hornee en su propia implementación del controlador o marco ODM según sea necesario.