Question

J'ai une collection de MongoDB qui a des documents comme ceux ci-dessous:

[
  {
  :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 besoin est de construire un « tableau de bord » regroupant l'activité récente (le jour en cours) pour chaque élément. 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 sera utilisé pour construire une syntaxe « style Facebook » comme: ". Mike, John et 3 autres ont ajouté des commentaires sur votre article aujourd'hui

Comment puis-je regrouper ces données en utilisant un groupe ou d'une carte-fonction reduce?

Était-ce utile?

La solution

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

Méthode # 1: Carte-reduce

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

Utiliser la carte-reduce à la variable « out » qui va générer une nouvelle collection. Vous serez alors en mesure d'exécuter les requêtes en référé contre cette nouvelle collection.

La raison pour laquelle vous allez faire est que vous demandez une requête coûteuse, il est donc beaucoup plus raisonnable d'y accéder à « pas tout à fait » en temps réel.

Méthode 2: Double-écrit

Vous pouvez maintenir essentiellement deux collections « détails » (en haut un) et « résumé » (de l'un en bas). Chaque fois que vous faites une écriture aux détails, effectuer également une mise à jour du résumé.

MongoDB a plusieurs méthodes de tableau ( $ pousser, $ pull, $ tranche ), qui devrait permettre de garder le tableau « vote_created » mise à jour.

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, je voudrais simplement utiliser la méthode # 2 et ajouter simplement au tableau « vote_created ». Je mettrais le « Mike, John et 3 autres ... » quelque part de syntaxe dans la vue, b / c il est vraiment logique voir pas la logique DB.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top