MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Średnie zapytania agregacyjne w Meteor

Od wersji Meteor 0.6.5 interfejs API kolekcji nie obsługuje jeszcze zapytań agregujących, ponieważ nie ma (bezpośredniego) sposobu na ich aktualizowanie na żywo. Jednak nadal możesz napisać je samodzielnie i udostępnić je w Meteor.publish , chociaż wynik będzie statyczny. Moim zdaniem robienie tego w ten sposób jest nadal preferowane, ponieważ można łączyć wiele agregacji i korzystać z interfejsu API do zbierania danych po stronie 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);
            }
        )
    );
});

Powyższe jest przykładem grupowania/agregacji liczebności. Kilka ważnych rzeczy:

  • Gdy to zrobisz, naturalnie wykonasz agregację na server_collection_name i wypychanie wyników do innej kolekcji o nazwie client_collection_name .
  • Ta subskrypcja nie będzie aktywna i prawdopodobnie będzie aktualizowana za każdym razem, gdy zmienią się argumenty, więc używamy naprawdę prostej pętli, która po prostu wypycha wszystkie wyniki.
  • Wyniki agregacji nie mają identyfikatorów Mongo ObjectID, więc generujemy kilka własnych.
  • Wywołanie zwrotne do agregacji musi być opakowane w światłowód. Używam Meteor.bindEnvironment tutaj, ale można również użyć Future dla większej kontroli na niskim poziomie.

Jeśli zaczniesz łączyć wyniki takich publikacji, musisz dokładnie rozważyć, w jaki sposób losowo generowane identyfikatory wpływają na pole scalania. Jednak prosta implementacja tego jest tylko standardowym zapytaniem do bazy danych, z wyjątkiem tego, że jest wygodniejsza w użyciu po stronie klienta Meteor API.

TL;Wersja DR :Prawie za każdym razem, gdy wysyłasz dane z serwera, publish jest lepsze niż method .

Aby uzyskać więcej informacji o różnych sposobach agregacji, sprawdź ten post .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak stworzyć użytkownika w mongodb za pomocą docker-compose

  2. Jak działa unhideIndex() w MongoDB

  3. Jak zmienić nazwę kolekcji w mongoose.model?

  4. MongoDB:locale::facet::_S_create_c_locale nazwa nieprawidłowa

  5. Uruchom skrypt javascript (plik .js) w mongodb, w tym inny plik w js