2015-01-14 5 views
10

È possibile pubblicare solo il conteggio di una raccolta per l'utente? Voglio visualizzare il conteggio totale sulla home page, ma non passare tutti i dati all'utente. Questo è quello che ho provato ma non funziona:Meteor - Pubblica solo il conteggio per una collezione

Meteor.publish('task-count', function() { 
    return Tasks.find().count(); 
}); 

this.route('home', { 
    path: '/', 
    waitOn: function() { 
     return Meteor.subscribe('task-count'); 
    } 
}); 

Quando provo questo, ho un'animazione di caricamento senza fine.

+0

è quelli 'Tasks' appartengono a utenti o niente? Perché sto chiedendo è che puoi mantenere quel conto dentro la raccolta degli utenti '' e te stesso e ottenerlo da lì – ajduke

risposta

16

Meteor.publish le funzioni devono restituire i cursori, ma qui si restituisce direttamente un Number che è il numero totale di documenti nella raccolta Tasks.

Conteggio dei documenti in Meteor è un compito sorprendentemente più difficile di quello che appare se si vuole farlo nel modo corretto: utilizzando una soluzione sia elegante ed efficace.

Il pacchetto ros:publish-counts (una forcella di tmeasday:publish-counts) prevede conteggi accurati per piccole collezioni (100-1000) o conta "quasi" accurati per grandi collezioni (decine di migliaia) utilizzando l'opzione fastCount.

Si può usare in questo modo:

// server-side publish (small collection) 
Meteor.publish("tasks-count",function(){ 
    Counts.publish(this,"tasks-count",Tasks.find()); 
}); 

// server-side publish (large collection) 
Meteor.publish("tasks-count",function(){ 
    Counts.publish(this,"tasks-count",Tasks.find(), {fastCount: true}); 
}); 

// client-side use 
Template.myTemplate.helpers({ 
    tasksCount:function(){ 
    return Counts.get("tasks-count"); 
    } 
}); 

si otterrà un conteggio reattivo sul lato client e un server-side ragionevolmente performante implementazione.

Questo problema è discusso in una lezione di prova di Meteor (a pagamento) proiettile, che è una lettura consigliata: https://bulletproofmeteor.com/

6

vorrei usare un client Meteor.call

:

var count; /// Global Client Variable 

Meteor.startup(function() { 
    Meteor.call("count", function (error, result) { 
     count = result; 
    }) 
}); 

ritorno count in qualche aiutante

Server:

Meteor.methods({ 
    count: function() { 
    return Tasks.find().count(); 
    } 
}) 

* Nota questa soluzione non sarebbe reattivo. Tuttavia, se si desidera reattività, può essere incorporata.