2010-11-19 42 views
2

J'ai une collection de MongoDB qui a des documents comme ceux ci-dessous:données agrégées MongoDB pour générer « dernière activité »

[ 
    { 
    :event => {:type => 'comment_created'}, 
    :item => {:id => 10}, 
    :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'} 
    } 

, 
    { 
    :event => {:type => 'vote_created'}, 
    :item => {:id => 10}, 
    :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'} 
    } 
] 

Ce que je dois est de construire un « tableau de bord » regroupant l'activité récente (le jour en cours) pour chaque article. Le résultat devrait être quelque chose comme:

{ 
:item_id => 10, 
:events => { 
    :vote_created => [.. ordered list with latest 3 vote_created events/documents], 
    :comment_created => [.. ordered list with latest 3 comment_created events/documents ], 
    } 
} 

Le résultat serait utilisé pour construire une syntaxe « style Facebook » comme: « Mike, John et 3 autres ont ajouté des commentaires sur votre article aujourd'hui. »

Comment agréger ces données à l'aide d'un groupe ou d'une fonction de réduction de carte?

Répondre

4

OK, il y a deux façons de le faire:

Méthode # 1: Carte-Réduire

Alors d'abord, vous aurez envie de lancer une carte-réduire, pas un groupe.

Utilisez Map-Reduce avec la variable "out" qui générera une nouvelle collection. Vous pourrez ensuite exécuter les requêtes récapitulatives sur cette nouvelle collection. La raison pour laquelle vous ferez cela est que vous demandez une requête coûteuse, il est donc beaucoup plus raisonnable d'y accéder en temps réel "pas tout à fait".

Méthode 2: Double-écrit

Vous pouvez maintenir essentiellement deux collections "détails" (en haut un) et "résumé" (en bas à un). Chaque fois que vous faites une écriture dans les détails, effectuez également une mise à jour du résumé.

MongoDB possède plusieurs méthodes de tableau ($push, $pull, $slice), ce qui devrait permettre de maintenir à jour la matrice «vot_created».

Préférences

La méthode que vous sélectionnez dépend entièrement du type d'architecture que vous avez et l'expérience utilisateur que vous voulez. Personnellement, j'utiliserais juste la méthode n ° 2 et je continuerais simplement à l'ajouter au tableau "voting_created". Je mettrais la syntaxe 'Mike, John et 3 autres ...' quelque part sur la vue, b/c c'est vraiment la logique de vue pas la logique DB.

Oui, la méthode 2 prend plus d'espace, mais elle vous donne également des réponses rapides aux questions que vous posez beaucoup. Donc, vous allez devoir sacrifier l'espace pour obtenir cette vitesse.