2013-08-19 4 views
0

J'ai 18 documents dans mon film de collection. Pour chaque film, par exemple:Comment additionner un tableau avec meteor/mongo

{ 
    title: "Test Movie 2", 
    date: [20130808, 20130606], 
    score: [ {"pete": 1, "mary": 1, "simon": 1, "pat": 2, "mike": 0}, 
      {"pete": 5, "mary": 5, "simon": 5, "pat": 0, "mike": 5}] 
} 

Maintenant, je veux montrer la date et la somme du deuxième document dans le tableau « score » sur le client, comme:

<div class="details"> 
    Test Movie 2: 20 points 20130606 
</div> 

Demandez à quelqu'un une idée comment je peux faire ça?

+0

peut-être cela http://stackoverflow.com/questions/12162681/mongodb-2-1-aggregate-framework-sum-of-array-elements-matching-a-name vous aidera – Freak

Répondre

1

Vous pouvez utiliser une transformation, il peut être préférable de définir chaque document avec un nom et de définir explicitement les points en tant que paire nom/valeur au lieu que les points soient la valeur de chaque nom de personne.

Mais cela devrait fonctionner:

Movies.find({}, {transform: function(doc) { 
    var total_points = 0; 
    var people = doc.score[1]; //Second in array 
    for(point in people) { 
     total_points += people[point] 
    } 

    doc.points = total_points; 
    return doc; 
}}); 

Cela devrait vous donner:

{ 
    title: "Test Movie 2", 
    points: 20, 
    date: [20130808, 20130606], 
    score: [ {"pete": 1, "mary": 1, "simon": 1, "pat": 2, "mike": 0}, 
      {"pete": 5, "mary": 5, "simon": 5, "pat": 0, "mike": 5}] 
} 
+0

J'ai décidé pour cette approche, mais cela ne fonctionne pas. J'ai copié le code dans mon fichier JavaScript, mais malheureusement, il ne change pas mes documents. Je vais continuer à essayer ... – Sebastian

+0

Oh désolé j'ai oublié de 'return doc' dans la transformation. Essayez avec le code mis à jour ci-dessus – Akshat

0

peut Mongo probablement faire purement et simplement, mais tu ne vas pas être en mesure de le faire directement en interrogeant une collection due à la limitation du paquet Mongo livedata à partir de 0.6.5. Le cadre d'agrégation est également interdit, et ils semblent avoir retiré la méthode «cachée» qui permettait un accès direct à Mongo.

Ainsi, vos options sont:

  • utilise une transformation selon la réponse de Akshat - le meilleur des deux mondes

  • Aggregate manuellement dans le client dans un assistant de modèle. Je recommande d'utiliser _.js qui est "gratuit" avec Meteor (encore une fois cela peut changer, mais vous pouvez toujours tirer la bibliothèque manuellement plus tard). Var sum = _reduce (score [1], fonction (memo, num) {return memo + num;}, 0);

    (Je n'ai pas testé ce qui précède, mais il devrait vous envoyer sur la bonne voie).

  • Agréger en amont, lors de l'insertion/mise à jour/suppression, probablement en observant les changements sur la collection et en introduisant la somme() des éléments que vous insérez dans la même collection ou agrégée.

La méthode utilisée dépend de l'endroit où vous importe le plus à la performance, faisant habituellement des agrégats avant tendance insert pour éviter des problèmes plus tard, et charge allège.

Bonne chance et laissez-nous savoir comment vous allez.

Questions connexes