Ok, wciąż w mojej aplikacji z zabawkami, chcę dowiedzieć się, jaki jest średni przebieg w grupie odometrów właścicieli samochodów. Jest to dość łatwe dla klienta, ale nie skaluje się. Dobrze? Ale na serwerze nie wiem dokładnie, jak to osiągnąć.Średnia liczba zapytań o agregację w Meteoru
Pytania:
- Jak wdrożyć coś na serwerze następnie używać go na kliencie?
- Jak wykorzystać funkcję agregacji $ avg mongo do zoptymalizowania funkcji agregacji?
- Lub alternatywnie (2) jak zrobić mapę/zmniejszyć na serwerze i udostępnić ją klientowi?
Sugestia przez @HubertOG było wykorzystanie Meteor.call, co ma sens i zrobiłem tak:
# Client side
Template.mileage.average_miles = ->
answer = null
Meteor.call "average_mileage", (error, result) ->
console.log "got average mileage result #{result}"
answer = result
console.log "but wait, answer = #{answer}"
answer
# Server side
Meteor.methods average_mileage: ->
console.log "server mileage called"
total = count = 0
r = Mileage.find({}).forEach (mileage) ->
total += mileage.mileage
count += 1
console.log "server about to return #{total/count}"
total/count
To wydaje się działać dobrze, ale to nie dlatego, że tak blisko jak ja można powiedzieć, że Meteor.call
jest połączeniem asynchronicznym, a answer
zawsze będzie zwracanym zerem. Obsługa rzeczy na serwerze wydaje się dość powszechnym przypadkiem użycia, który musiałam przeoczyć. Co by to było?
Dzięki!
Nie chcę opuścić tej odpowiedzi bez "dziękuję". To jest całkowicie niesamowita odpowiedź. Niedługo potem zostałem odsunięty od innego projektu, ale Andrew, oczywiście, w to włożyłeś dużo uwagi i jestem bardzo wdzięczny. –
@SteveRoss nie ma za co. Dzięki za miłe słowa! –
Kudos za doskonały przykład agregacji. To był jedyny, który pracował dla mnie. I że udało ci się to zrobić bez pakietu, z MongoInternals, i funkcją publikowania ... wisienką na czerwonym aksamicie. Dziękuję za podzielenie się! – AbigailW