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

Problém s agregací a seskupením MongoDB v MeteorJS

Pokud používáte agregát meteorických hacků balíček pro implementaci .aggregate() příkaz na vaší sbírce, pak jako odpověď pouze vrátí pole. Takže to musíte zapracovat do podoby publikované sbírky:

Meteor.publish("completedLB,function() {
    var self = this;

    var results = userCompleted.aggregate([
        { "$match": { "progressState": true } },
        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": "$progressState" },
             "count": { "$sum": 1 }
        }},
        { "$sort": { "_id": 1 } }
    ]);

    _.each(results,function(result) {
        self.added("client_collection_name",Random.id(), {
            userId: result._id,
            progressState: result.progressState,
            count: result.count
        });
    });
    self.ready();
});

Nebo zahrnout false se počítá, jak váš navrhovaný výstup navrhuje sám:

        { "$group": {
            "_id": "$userId",
             "progressState": { "$first": true },
             "count": { "$sum": { "$cond": ["$progressState", 1,0] }
        }},
        { "$sort": { "_id": 1 } }

Jako kanál s $cond vyhodnocení převést na číselné.

Kde v základní agregaci jen "sčítáte" shodné výsledky a samozřejmě $sort odkazuje na pole přítomné ve výstupu, což by ve vašem příkladu byla hodnota "userId" nyní v _id klíč z agregace, ale mohl by být také "počítán" k objednávce podle celkového počtu, pokud chcete.

Tato část produkovala chybu, jako $sort je aktuální pole a nikoli hodnota pole s $ notace.

Ale samozřejmě, abyste mohli publikovat jako kolekci přístupnou klientovi, musíte nahradit skutečné _id s něčím očekávaným. Takže zde funguje náhodné generování id, stejně jako zahrnutí ostatních polí.

Pro trochu více podrobností a také alternativu k balíčku „hacks“, který funguje pouze s vanilla instalací, existuje také tato odpověď od sebe, který má jako příklad úplný seznam.




  1. Meteor vidí vzdálenou instanci mongodb pomocí MongoInternals.RemoteCollectionDriver

  2. SignalR se nemůže připojit k Azure Redis na SSL

  3. SQLite na Androidu a MongoDB se synchronizací

  4. Přepsat objekt v mongodb