2017-09-09 2 views
1

Ich habe vor einigen Tagen MongoDB auf meinem Computer installiert, um einen Test für eine Arbeit zu machen, im Detail müssen wir eine riesige Menge an Daten von einem Postgres-basierten System zu einem MongoDB-System übertragen. Weil wir MongoDB nicht kennen (das erste Mal benutzen wir es), haben wir versucht, die Dokumentation zu studieren und haben einige Tests an einer kleinen DB mit wenig Daten durchgeführt, um die Leistung zu testen ... Nach vielen Tests haben wir zu dieser Zeit noch eine Verschlechterung ... Aber jetzt werde ich den Kontext erklären, also könnte mir vielleicht jemand sagen, ob wir etwas falsch gemacht haben oder nicht. Wir wissen, was die mehr „problematisch“ Abfragen sind und ich werde hier einer von ihnen, in Postgres geschrieben hat, ist die Abfrage so etwas wie dieses (ich die unnötige geschnitten werden):MongoDB Optimierung Aggregation

selectStmt varchar = 'SELECT station.radarmeteo_id, 
    date(datetime_range) AS datetime_range, 
    district.name AS district, 
    city.name AS city, 
    min_temperature::real/10::real, 
    max_temperature::real/10::real, 
    rainfall_daily::real/10::real, 
    max_wind_speed::real/10::real, 
    extract(epoch FROM datetime_range) as unix_datetime '; 

fromStmt varchar = ' FROM measurement_daily 
    INNER JOIN station ON measurement_daily.station_id = station.id; 

In MongoDB wir dies schrieb:

db.measurement_daily.aggregate([{"$match":{"min_temperature":{"$gt":random.randint(-30, 14), "$lt":random.randint(18, 50)}}},{"$lookup":{"from":"station","localField":"station_id", "foreignField":"_id", "as": "scd"}},{"$unwind":"$scd"},{"$project":{"_id":1,"min_temperature":1,"max_temperature":1, "rainfall_daily":1, "max_wind_speed":1, "radarmeteo_id":"$scd.radarmeteo_id", "city_name":"$scd.city_name", "district_name":"$scd.district_name"}},{"$out":"result"}]) 

Was ich hier frage ist: es sollte besser geschrieben werden? Oder könnte es einen besseren Weg geben, dasselbe Ergebnis zu erzielen? Gibt es noch andere Optimierungen, die wir verwenden können? Wir brauchen die beste Antwortzeit, weil die reale DB nur etwa 200.000.000 Daten in dieser Sammlung haben soll ... Und genau hier mit 2 Tabellen mit 1000 (Station) und 6400 (measurement_daily) Einträgen/Dokumenten haben 3,5-4s (Postgres) vs 30-32s (MongoDB) als Antwortzeit ... (Um die Leistung in beiden Systemen zu testen, wird die Abfrage 200 mal wiederholt (deshalb haben wir 3,5-4s und 30 (-32s für jeweils eine Abfrage), um eine "homogene" Reaktionszeit zu haben, um die Konditionierung durch externe Ursachen zu minimieren.) Jede Hilfe wird wirklich geschätzt ...

Antwort

2

Nach mongoDB documentation Wenn ein $ abload folgt sofort eine andere $ lookup, und Die $ unwind-Funktion arbeitet auf dem as-Feld des $ lookup, der Optimierer kann die $ abwickeln in die $ lookup-Phase. Dies vermeidet die Erstellung von großen Zwischendokumenten.

In Ihrem Fall wird es wie folgt aussehen:

"$lookup": { 
    "from":"station", 
    "localField":"station_id", 
    "foreignField":"_id", 
    "as": "scd" 
    unwinding: { preserveNullAndEmptyArrays: false } 
}