MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como fazer o grupo mongo no lado do servidor Meteor


A partir do Meteor v1.0.4:

Então você pode chamar collection.rawCollection() para obter o objeto de coleção subjacente:
var rawCollection = Orders.rawCollection();

Esta rawCollection tem um método group que é equivalente ao group método no shell do MongoDB. A API do nó subjacente é assíncrona, portanto, você desejará convertê-la em uma função síncrona de alguma forma. Não podemos usar Meteor.wrapAsync diretamente desde group recebe argumentos de função que não são o retorno de chamada principal, então vamos contornar isso com um wrapper:
function ordersGroup(/* arguments */) {
    var args = _.toArray(arguments);
    return Meteor.wrapAsync(function (callback) {
        rawCollection.group.apply(rawCollection, args.concat([callback]));
    })();
}

Dentro do seu método, você pode chamar ordersGroup como você faria db.orders.group na concha do Mongo. No entanto, os argumentos são passados ​​separadamente, em vez de em um objeto:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])

Para obter mais informações, consulte esta documentação (embora observe que o callback O parâmetro deve ser deixado de fora, pois nosso encapsulamento assíncrono cuida disso).

Então você terá que passá-los separadamente:
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);
    }
);

Claro, isso só funciona no servidor, portanto, certifique-se de que seu método esteja no código somente do servidor (de preferência no server subdiretório, ou dentro de um if (Meteor.isServer) ).