sql >> Database >  >> NoSQL >> MongoDB

Hoe mongo-groep aan de Meteor-serverzijde te doen?

Vanaf Meteor v1.0.4:

U kunt dus collection.rawCollection() . aanroepen om het onderliggende collectieobject te krijgen:

var rawCollection = Orders.rawCollection();

Deze rawCollection heeft een methode group wat gelijk is aan de group methode in de MongoDB-shell. De onderliggende knooppunt-API is echter asynchroon, dus u zult deze op de een of andere manier naar een synchrone functie willen converteren. We kunnen Meteor.wrapAsync niet gebruiken rechtstreeks vanaf group neemt functieargumenten die niet de primaire callback zijn, dus we zullen dit omzeilen met een wrapper:

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

Binnen uw methode kunt u ordersGroup . aanroepen zoals je zou doen db.orders.group in de Mongo-schelp. De argumenten worden echter afzonderlijk doorgegeven, in plaats van in een object:

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

Zie deze documentatie voor meer informatie. (houd er echter rekening mee dat de callback parameter moet worden weggelaten, omdat onze async-wrapping daarvoor zorgt).

Je moet ze dus apart inleveren:

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

Dit werkt natuurlijk alleen op de server, dus zorg ervoor dat je methode in server-only code staat (bij voorkeur in de server submap, of in een if (Meteor.isServer) ).




  1. meteoor, mongodb, spatiebalken, hoe geef ik slechts 2 decimalen weer?

  2. Een gedeeltelijke index maken wanneer het veld niet null is

  3. MongoDB $pull array 2 niveau

  4. Overzicht van de MongoDB Database Profiler