MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment créer un groupe mongo côté serveur Meteor

Depuis Meteor v1.0.4 :

Vous pouvez donc appeler collection.rawCollection() pour obtenir l'objet de collection sous-jacent :

var rawCollection = Orders.rawCollection();

Cette rawCollection a une méthode group qui équivaut au group méthode dans le shell MongoDB. L'API de nœud sous-jacente est cependant asynchrone, vous voudrez donc la convertir en une fonction synchrone d'une manière ou d'une autre. Nous ne pouvons pas utiliser Meteor.wrapAsync directement depuis le group prend des arguments de fonction qui ne sont pas le rappel principal, nous allons donc contourner cela avec un wrapper :

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

Dans votre méthode, vous pouvez appeler ordersGroup comme vous le feriez db.orders.group dans la coquille Mongo. Cependant, les arguments sont passés séparément, plutôt que dans un objet :

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

Pour plus d'informations, consultez cette documentation (bien que notez que le callback paramètre doit être omis, car notre emballage asynchrone s'en charge).

Vous devrez donc les transmettre séparément :

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

Bien sûr, cela ne fonctionne que sur le serveur, alors assurez-vous que votre méthode est en code serveur uniquement (de préférence dans le server sous-répertoire, ou à l'intérieur d'un if (Meteor.isServer) ).