sql >> Base de Datos >  >> NoSQL >> MongoDB

Grupo MongoDB por elementos internos de matriz

¿Qué marco estás usando? Este no es el shell de MongoDB y parece un envoltorio extraño 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 shell 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 configuró una var para los últimos 7 días
  2. Proyecte solo los campos que necesitamos { ¡Solo necesitamos uno! }
  3. Desenrolle la matriz para que ahora tengamos un registro para cada elemento de la matriz en cada documento
  4. Grupo sobre el Artista de los documentos ampliados
  5. Proyecta en un formato de documento que puedes usar como grupo jugando con _id
  6. Ordene los resultados en orden inverso para ver los primeros etiquetados primero

Y lo mejor de la agregación es que puede construir gradualmente esas etapas para ver qué está pasando.

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