examples - Grupo MongoDB por elementos internos de la matriz
mongodb aggregate sum (1)
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:
- Filter por fecha porque ya ha establecido una var para los últimos 7 días
- Project solo el (los) campo (s) que necesitamos (¡solo necesitamos uno! }
- $unwind la matriz para que ahora tengamos un registro de cada elemento de la matriz en cada documento
- Group sobre el artista a partir de los documentos ampliados
- Proyecte en un formato de documento que puede usar como grupo mezclado con _id
- Sort 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.