MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie man eine Mongo-Gruppe auf der Seite des Meteor-Servers erstellt

Ab Meteor v1.0.4:

Sie können also collection.rawCollection() aufrufen um das zugrunde liegende Sammlungsobjekt zu erhalten:

var rawCollection = Orders.rawCollection();

Diese rawCollection hat eine Methode group was der group entspricht -Methode in der MongoDB-Shell. Die zugrunde liegende Node-API ist jedoch asynchron, daher sollten Sie sie irgendwie in eine synchrone Funktion konvertieren. Wir können Meteor.wrapAsync nicht verwenden direkt seit group nimmt Funktionsargumente, die nicht der primäre Callback sind, also werden wir dies mit einem Wrapper umgehen:

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

Innerhalb Ihrer Methode können Sie ordersGroup aufrufen wie Sie es mit db.orders.group tun würden in der Mongo-Muschel. Die Argumente werden jedoch separat übergeben und nicht in einem Objekt:

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

Weitere Informationen finden Sie in dieser Dokumentation (beachten Sie jedoch, dass der callback Parameter sollte weggelassen werden, da unser Async-Wrapping sich darum kümmert).

Sie müssen sie also separat übergeben:

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

Dies funktioniert natürlich nur auf dem Server, stellen Sie also sicher, dass sich Ihre Methode in Nur-Server-Code befindet (vorzugsweise im server Unterverzeichnis oder innerhalb eines if (Meteor.isServer) ).