2016-05-19 8 views
0

Vor einiger Zeit habe ich während eines Hackathons die Website crowdfundstats.com erstellt. Die Website gibt einige interessante Einblicke, basierend auf den 130.000 Kickstarter-Projektdaten, die wir gesammelt haben. Das interessanteste Feature ist die http://crowdfundstats.com/map.html, auf der Sie einen Radius auf der Weltkarte ziehen können, um Informationen über Projekte innerhalb dieses Radius zu erhalten.Wie optimiert man eine mongodb Geospatial Abfrage?

Ich verwende die Aggregatfunktion, um alle Projekte innerhalb des Radius basierend auf ihren Geoinformationen zu finden. Jedes Projekt hat eine geo Lage in folgendem Format:

{ g1 : 
    { type : "Point" }, 
    { coordinates : [ -83.102840423584, 42.354639053345] }  
} 

Die Aggregatfunktion gibt dann die Gesamtmenge an Unterstützern, die durchschnittliche Dauer, den Erfolg Prozentsatz und die Gesamtmenge der Projekte innerhalb des Radius:

{'$match' : 
    {g1 : 
     {$geoWithin : 
      { $centerSphere :[[parseFloat(long), parseFloat(lat) ], radius/6371 ] 
      } 
     } 
    } 
}, 
{'$group': 
    { "_id":"", 
     "backers": {"$sum": "$backers"}, 
     "dateDiff2": {"$avg": "$dateDiff2"}, 
     "completed": {"$avg": "$completed"},  
     "total":  {"$sum": 1} 
    } 
} 

Das Problem ist, dass das Ergebnis der Abfrage sehr lange dauert (z. B. mehr als 10 Sekunden beim Ziehen des Radius über Großbritannien). Ich habe hinzugefügt, die bereits eine 2dsphere Index Geschwindigkeit zu erhöhen, aber das hat fast keine Wirkung:

{ 
    "g1" : "2dsphere" 
} 

Gibt es etwas, was ich tun kann um die Abfrage zu optimieren, oder ist dies die erwartete Leistung auf geospatial Abfragen?

Vielen Dank im Voraus

Antwort

1

Für alle auf diesen Thread stolpert, ich habe die meisten schweren Abfrage von 15 Sekunden bis 0,5 Sekunden ein Upgrade von MongoDB 3,0 bis 3,2 verbessert. Sie haben die Geodatensuche immens verbessert. Sie können mehr darüber auf der MongoDB blog

lesen
Verwandte Themen