Je ne comprends toujours pas complètement comment fonctionne map/reduce, alors j'ai pensé donner un exemple d'un problème que je dois résoudre, et j'espère que la réponse m'aidera à comprendre concept.MongoDB: Données agrégées en utilisant Map/Reduce
Je suis suivi de pages vues en utilisant une structure de document similaire à ceci:
{
"timestamp" : 1299990045,
"visitor" : {
"region" : {
"country_code" : "US",
},
"browser" : {
"name" : "IE",
"version" : "8.0",
}
},
"referer" : {
"host" : "www.google.com",
"path" : "/",
"query" : "q=map%2Freduce"
}
}
je stocke un seul document pour chaque page vue. Étant donné que je reçois environ 15 millions de pages vues par jour, j'aimerais agréger ces résultats chaque nuit, enregistrer les résultats globaux pour ce jour, puis supprimer la collection pour commencer à stocker de nouveau les pages vues. Je veux que la sortie de la map/reduce à ressembler à ceci:
{
"day" : "Sun Mar 13 2011 00:00:00 GMT-0400 (EDT)",
"regions" : {
"US" : 235,
"CA" : 212,
"JP" : 121
},
"browsers" : {
"IE" : 145,
"Firefox" : 245,
"Chrome" : 95,
"Other" : 120
},
"referers" : {
"www.google.com" : 24,
"yahoo.com" 56
}
}
Je ne sais vraiment pas où commencer à faire ce genre de chose. Toute aide serait appréciée.
Vous avez presque certainement raison à propos de upserts comme je le fais. Faire une carte/réduire l'opération sur 15 millions de documents prendrait FOREVER. Merci pour la carte/réduire l'exemple si. Le concept a plus de sens maintenant. Map = construire une paire valeur/clé pour chaque document, réduire = agréger toutes ces paires valeur/clé. – mellowsoon
Note supplémentaire, je pense que je vais devoir regarder dans une fonction de finalisation. Après tout, je n'aurais pas besoin de tous les pays visités un jour donné. Seulement le top 20. Est-ce là où et comment une fonction de finalisation est utilisée? – mellowsoon
Eh bien, vous pouvez le faire dans un finalize(), mais ce serait un peu inefficace parce que vous seriez en train de faire un tas d'agrégations que vous alliez juste jeter quand c'est fait. S'il y a un moyen de ne pas traiter les pays indésirables en premier lieu, ce serait préférable. Mais en général, oui vous pouvez faire ce genre de filtrage dans une finalisation. – jared