2016-05-11 6 views
0

Я создал код для count сбор данных с использованием группы агрегата, но теперь у меня есть проблема, когда группа счетчиков процессов не может дать правильный результат. Я не знаю, где проблема.Meteor: count by group aggregate

В результате этого кода Result. Существует мой код:

//js 

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 result = []; 
    _.each(subs, function(value, key) { 
     result.push({kategori: key, amount: value}); 
    }); 

    return result; 
    } 
}); 



//publish 
Meteor.publish("profilcount",function(args) { 
    var sub = this; 

    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db; 

    var pipeline = [ 
     { "$group": { 
     "_id": "$kategori", 
     count:{$sum:amount} 
     }} 
     ]; 

    db.collection("profil").aggregate(  
     pipeline, 

     Meteor.bindEnvironment(
      function(err, result) { 
       _.each(result, function(e) { 
        sub.added("profil", Random.id(), { 
        kategori: kategori._id, 
        amount: kategori.count 
        }); 
       }); 
       sub.ready(); 
      }, 
      function(error) { 
       Meteor._debug("Error doing aggregation: " + error); 
      } 
     ) 
    ); 
}); 

// HTML {{#each profilcount}} <tr> <td>{{kategori}}</td> <td>{{ amount}}</td>
</tr> {{/each}}

Я хочу, чтобы результат, как это. Result

+0

Что является результатом совокупности (самого объекта)? Разве вы не имели в виду 'count: {$ sum: '$ amount'}' на этапе '$ group'? – MasterAM

+0

да, я имею в виду это, но ничего не получается из этого кода. – nurul

+0

Попробуйте немного сломать его и изолировать проблему. Проверьте результаты самого агрегата и убедитесь, что они соответствуют вашим ожиданиям. Затем убедитесь, что клиент получает нужные данные из коллекции, а затем, наконец, убедитесь, что ваша логика представления работает. Прямо сейчас есть несколько мест, где все может пойти не так. – MasterAM

ответ

0

У меня есть другое решение для этого, без использования агрегата. На всякий случай, если это поможет вам.

// JS

Template.laporankategori.helpers({ 
profilcount() { 
    var result = []; 
    var categs = []; 
    profil.find().forEach(function(profil) { 
    if(categs.indexOf(profil.kategori) > -1) { 
    for (var i = 0; i < result.length; i++) { 
     var res = result[i]; 
     var count = res.count + 1; 
     var amount = res.amount + profil.amount; 
     result[i].count = count; 
     result[i].amount = amount; 
     break; 
    } 
    } else { 
    result.push({ 
     name: profil.kategori, 
     amount : profil.amount, 
     count : 1 
    }); 
    categs.push(profil.kategori); 
    } 
    }); 
    return result; 
} 
}); 

Meteor.publish("profil",function(args) { 
    return profil.find({},{fields: {amount: 1, kategori:1}}); 
}); 

// HTML

<table> 
    <thead> 
     <tr> 
      <td> Kategori </td> 
      <td> Total Amount</td> 
      <td> Count </td> 
     </tr> 
    </thead> 
    <tbody> 
    {{#each profilcount}} 
     <tr> 
       <td>{{ name }}</td> 
       <td>{{ amount }}</td> 
       <td>{{ count }}</td> 
      </tr> 
    {{/each}} 
    </tbody> 
</table>