He creado código javascript para contar algunos datos en la colección. El resultado es NaN . Cómo declarar en este código para obtener el verdadero resultado (int) no NaN.

Template.laporankategori.helpers({
    profilcount: function() {
        var subs = {};
        Profil.find().forEach(function(e) {
            if (subs[e.kategori] == null)
               subs[e.kategori] = 0;
            subs[e.kategori] += e.amount;
        });

        var results = [];
        _.each(subs, function (value, key) {
            results.push({category: key, amount: value});
        });

        return results;
    }
});

//html
{{#each profilcount}}
    <tr>    
        <td>{{category}}</td>
        <td>{{ amount}}</td>            
    </tr>   
{{/each}}

//

Profil = new Mongo.Collection ('profil');
Meteor.subscribe ('profil');

Template.laporankategori.helpers({
    profilcount: function() {
        return Profil.find({});
    }
});

Quiero el resultado como este cuando ordeno con shell. Resultado Ahora el resultado sigue siendo así. Resultado

0
nurul 13 may. 2016 a las 08:25

4 respuestas

La mejor respuesta

¿Cuál es el tipo de datos del campo amount en los documentos Profil? Si es una cadena, agregará cadenas, en lugar de analizarla como número (0 + "1" = "01"). Puede usar Number para analizarlo en un número como este

Profil.find().forEach(function(e) {
    if (subs[e.kategori] == null)
        subs[e.kategori] = 0;
    subs[e.kategori] += Number(e.amount); //<---- Change "e.amount" to "Number(e.amount)"
});

ACTUALIZACIÓN Creo que algunos de los documentos no tienen especificado amount o tienen un valor que no es un número

Profil.find().forEach(function(e) {
    if (subs[e.kategori] == null)
        subs[e.kategori] = 0;
    //if (isNaN(e.amount)) console.log(e.amount.toString() + " is not a valid number"); // <-- Uncomment this line and check your console to see invalid data..
    var value = !isNaN(e.amount) ? Number(e.amount) : 0;
    subs[e.kategori] += value;
});
0
Kishor 13 may. 2016 a las 09:47

El código se ve bien. Pero creo que la cantidad se almacena en formato de cadena en la base de datos. Prueba el siguiente código:

  subs[e.kategori] += e.amount;

Reemplace esta línea con:

  subs[e.kategori] += parseInt(e.amount);

Se recomienda que almacene los valores en formato entero en su base de datos. Espero eso ayude.

0
Sudheer Jami 13 may. 2016 a las 09:14

En su lugar, use el siguiente código de manera apropiada,

var profile = Profil.find().fetch();
var results = _.chain(profile)
        .map(function(item){ 
                return {Kategori: kategori, amount: amount}; 
            })
        .groupBy('kategori')
        .map(function (value,key) { 
        var reduceVal = _.reduce(value, function (acc, val)
                                        { 
                                            return acc + val.amount;
                                        },0 ); 
        return {'Kategori': kategori,'count' :reduceVal};
                 })     
        .value();
0
Ankur Soni 13 may. 2016 a las 14:16

Necesita devolver la longitud de la matriz de resultados

return results.length;
0
Gaurav Kalele 13 may. 2016 a las 05:28