2011-11-01 4 views
2

Disons que nous avons l'utilisateur et la collection de la poste. Dans la collection de post, votez stocker le nom d'utilisateur en tant que clé.Carte Mongodb réduire à travers 2 collection

db.user.insert({name:'a', age:12}); 
db.user.insert({name:'b', age:12}); 
db.user.insert({name:'c', age:22}); 
db.user.insert({name:'d', age:22}); 

db.post.insert({Title:'Title1', vote:[a]}); 
db.post.insert({Title:'Title2', vote:[a,b]}); 
db.post.insert({Title:'Title3', vote:[a,b,c]}); 
db.post.insert({Title:'Title4', vote:[a,b,c,d]}); 

Nous aimerions regrouper par la poste.Titre et trouver le nombre de votes dans l'âge de l'utilisateur différent.

> {_id:'Title1', value:{ ages:[{age:12, Count:1},{age:22, Count:0}]} } 
> {_id:'Title2', value:{ ages:[{age:12, Count:2},{age:22, Count:0}]} } 
> {_id:'Title3', value:{ ages:[{age:12, Count:2},{age:22, Count:1}]} } 
> {_id:'Title4', value:{ ages:[{age:12, Count:2},{age:22, Count:2}]} } 

J'ai parcouru et ne trouve pas un moyen d'accéder à 2 collection dans mongodb mapreduce. Pourrait-il être possible de réaliser en re-réduire?

Je sais qu'il est très simple d'incorporer le document utilisateur dans la publication, mais ce n'est pas une bonne façon de faire, car le document utilisateur réel a de nombreuses propriétés. Si nous incluons la version simplifiée du document utilisateur, cela limitera la dimension de l'analyse.

{Title:'Title1', vote:[{name:'a', age:12}]} 
+0

Il n'est pas possible d'effectuer une réduction de la mappe sur plusieurs collectes. Veuillez également expliquer votre raisonnement lorsque vous dites «ce n'est pas une bonne façon de faire» en ce qui concerne l'intégration d'un document. Fournissez votre considération de conception si possible. –

Répondre

1

MongoDB ne possède pas de multi-collection Map/Reduce. MongoDB n'a pas de syntaxe JOIN et peut ne pas être très bon pour les jointures ad-hoc. Vous devrez dénormaliser ces données d'une manière ou d'une autre.

Vous avez quelques options:

Option # 1: Intégrer l'âge du vote.

{Title:'Title1', vote:[{name:'a', age:12}]} 

Option # 2: Gardez un compteur des âges

{Title:'Title1', vote:[a, b], age: { "12" : 1, "22" : 1 }} 

Option # 3: Faites un "manuel" join

Votre dernière option est d'écrire le script/code qui fait une boucle for sur les deux collections et fusionne les données correctement.

Donc, vous bouclez sur post et affichez une collection avec le titre et la liste des votes. Ensuite, vous pouvez parcourir la nouvelle collection et mettre à jour les âges en recherchant chaque user.

Ma suggestion

Go # 1 ou # 2.

0

Au lieu de

{name:'a', age:12} 

Il est plus facile d'ajouter un nouveau champ à document utilisateur et le maintenir dans chaque vote update.Of Bien sûr, vous pouvez profiter d'utiliser la carte Réduire l'analyse de vos données.

{name:'a', age:12, voteTitle:["Title1","Title2","Title3","Title4"]} 
Questions connexes