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

Come fare il gruppo mongo sul lato server di Meteor

A partire da Meteor v1.0.4:

Quindi puoi chiamare collection.rawCollection() per ottenere l'oggetto raccolta sottostante:

var rawCollection = Orders.rawCollection();

Questa rawCollection ha un metodo group che è equivalente al group metodo nella shell MongoDB. Tuttavia, l'API del nodo sottostante è asincrona, quindi ti consigliamo di convertirla in una funzione sincrona in qualche modo. Non possiamo usare Meteor.wrapAsync direttamente dal group accetta argomenti di funzione che non sono il callback principale, quindi lavoreremo con un wrapper:

function ordersGroup(/* arguments */) {
    var args = _.toArray(arguments);
    return Meteor.wrapAsync(function (callback) {
        rawCollection.group.apply(rawCollection, args.concat([callback]));
    })();
}

All'interno del tuo metodo, puoi chiamare ordersGroup come faresti con db.orders.group nella conchiglia Mongo. Tuttavia, gli argomenti vengono passati separatamente, anziché in un oggetto:

ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])

Per ulteriori informazioni, consulta questa documentazione (sebbene si noti che il callback parametro dovrebbe essere omesso, poiché il nostro async-wrapping si occupa di questo).

Quindi dovrai passarli separatamente:

var result = ordersGroup(
    // keys
    function(doc) {
        return { year: doc.createdAt.toISOString().substring(0, 4) };
    },

    // condition
    {createdAt: {$lt: new Date("2015-12-31"), $gt: new Date("2015-01-01")}},

    // initial
    {months: {}},

    // reduce
    function(order, result) {
        var month = order.createdAt.getMonth()+1,
            date = order.createdAt.getDate();

        month = result.months[month] || (result.months[month] = {});
        date = month[date] || (month[date] = []);
        date.push(order);
    }
);

Ovviamente funziona solo sul server, quindi assicurati che il tuo metodo sia in codice solo server (preferibilmente nel server sottodirectory o all'interno di un if (Meteor.isServer) ).