MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Problema di aggregazione e raggruppamento MongoDB in MeteorJS

Se stai utilizzando il aggregato di hack di meteoriti pacchetto per implementare un .aggregate() comando sulla tua raccolta, quindi restituirà solo un array in risposta. Quindi devi trasformarlo in una forma di raccolta pubblicata:

Meteor.publish("completedLB,function() {
    var self = this;

    var results = userCompleted.aggregate([
        { "$match": { "progressState": true } },
        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": "$progressState" },
             "count": { "$sum": 1 }
        }},
        { "$sort": { "_id": 1 } }
    ]);

    _.each(results,function(result) {
        self.added("client_collection_name",Random.id(), {
            userId: result._id,
            progressState: result.progressState,
            count: result.count
        });
    });
    self.ready();
});

O per includere il false conta come suggerisce l'output suggerito:

        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": true },
             "count": { "$sum": { "$cond": ["$progressState", 1,0] }
        }},
        { "$sort": { "_id": 1 } }

Come pipeline con un $cond valutazione da convertire in numerico.

Dove nell'aggregazione di base stai semplicemente "sommando" i risultati abbinati e, naturalmente, il $sort fa riferimento a un campo presente nell'output, che nel tuo esempio sarebbe il valore "userId" ora nel _id chiave dall'aggregazione, ma potrebbe anche essere "contare" per ordinare in base al conteggio totale, se lo si desidera.

Quella parte stava producendo l'errore, come $sort è un campo presente e non un valore di campo con $ notazione.

Ma ovviamente per pubblicare come raccolta accessibile dal client è necessario sostituire l'effettivo _id con qualcosa di previsto. Quindi la generazione casuale di ID funziona qui, così come l'inclusione degli altri campi.

Per un po' più di dettagli e anche un'alternativa al pacchetto "hacks" che funziona solo con un'installazione vanilla, c'è anche questa risposta da solo che ha un elenco completo come esempio.