sql >> Databáze >  >> NoSQL >> MongoDB

Průměrné agregační dotazy v Meteoru

Od Meteoru 0.6.5 API kolekce zatím nepodporuje agregační dotazy, protože neexistuje žádný (přímý) způsob, jak na nich provádět živé aktualizace. Stále je však můžete napsat sami a zpřístupnit je v Meteor.publish , i když výsledek bude statický. Podle mého názoru je tento způsob stále vhodnější, protože můžete sloučit více agregací a používat rozhraní API pro kolekce na straně klienta.

Meteor.publish("someAggregation", function (args) {
    var sub = this;
    // This works for Meteor 0.6.5
    var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

    // Your arguments to Mongo's aggregation. Make these however you want.
    var pipeline = [
        { $match: doSomethingWith(args) },
        { $group: {
            _id: whatWeAreGroupingWith(args),
            count: { $sum: 1 }
        }}
    ];

    db.collection("server_collection_name").aggregate(        
        pipeline,
        // Need to wrap the callback so it gets called in a Fiber.
        Meteor.bindEnvironment(
            function(err, result) {
                // Add each of the results to the subscription.
                _.each(result, function(e) {
                    // Generate a random disposable id for aggregated documents
                    sub.added("client_collection_name", Random.id(), {
                        key: e._id.somethingOfInterest,                        
                        count: e.count
                    });
                });
                sub.ready();
            },
            function(error) {
                Meteor._debug( "Error doing aggregation: " + error);
            }
        )
    );
});

Výše uvedené je příklad seskupení/agregace počtu. Několik poznámek:

  • Když to uděláte, budete přirozeně provádět agregaci na server_collection_name a odeslání výsledků do jiné kolekce s názvem client_collection_name .
  • Toto předplatné nebude aktivní a bude pravděpodobně aktualizováno, kdykoli se změní argumenty, takže používáme opravdu jednoduchou smyčku, která pouze vytlačí všechny výsledky.
  • Výsledky agregace nemají Mongo ObjectID, takže generujeme nějaké vlastní.
  • Zpětné volání do agregace musí být zabaleno do Fiber. Používám Meteor.bindEnvironment zde ale lze také použít Future pro více kontroly na nízké úrovni.

Pokud začnete kombinovat výsledky publikací, jako jsou tyto, budete muset pečlivě zvážit, jak náhodně vygenerovaná ID ovlivní slučovací pole. Přímá implementace tohoto je však pouze standardním databázovým dotazem, kromě toho, že je pohodlnější použít jej s Meteor API na straně klienta.

Verze TL;DR :Téměř kdykoli odesíláte data ze serveru, publish je vhodnější než method .

Další informace o různých způsobech agregace přečtěte si tento příspěvek .



  1. Jak získat pole z kolekce mongoDB?

  2. Sdílení soketů přes samostatné instance nodeJS

  3. Aktualizace Service Stack Redis List

  4. Zjistěte, zda někdo měl narozeniny v příštích 30 dnech s mongo