sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo hacer un grupo mongo en el lado del servidor Meteor

A partir de Meteor v1.0.4:

Entonces puedes llamar a collection.rawCollection() para obtener el objeto de colección subyacente:

var rawCollection = Orders.rawCollection();

Esta rawCollection tiene un método group que es equivalente al group método en el shell de MongoDB. Sin embargo, la API del nodo subyacente es asíncrona, por lo que querrá convertirla en una función síncrona de alguna manera. No podemos usar Meteor.wrapAsync directamente desde group toma argumentos de función que no son la devolución de llamada principal, por lo que solucionaremos esto con un contenedor:

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

Dentro de su método, puede llamar a ordersGroup como lo harías db.orders.group en el caparazón de Mongo. Sin embargo, los argumentos se pasan por separado, en lugar de en un objeto:

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

Para obtener más información, consulte esta documentación (aunque tenga en cuenta que la callback el parámetro debe omitirse, ya que nuestro ajuste asíncrono se encarga de eso).

Así que tendrás que pasarlos por separado:

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);
    }
);

Por supuesto, esto solo funciona en el servidor, así que asegúrese de que su método esté en código de solo servidor (preferiblemente en el server subdirectorio, o dentro de un if (Meteor.isServer) ).