2017-09-09 4 views
1

며칠 전 MongoDB를 컴퓨터에 설치하여 작업에 대한 테스트를 수행했습니다. 자세한 내용은 Postgres 기반 시스템에서 MongoDB로 대량의 데이터를 전송해야합니다. 우리는 MongoDB (처음 사용했을 때)를 모르고 있었기 때문에 문서를 연구하려고 시도 했었고 성능을 테스트하기 위해 데이터가 거의없는 작은 DB에 대해 몇 가지 테스트를 수행했습니다 ... 현재 많은 테스트를 거친 후에도 악화되고있다. 그러나 지금 나는 상황을 설명 할 것이므로 누군가가 잘못했는지 아닌지 말해 줄 수있을 것이다. MongoDB의에서MongoDB 최적화 집계

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; 

우리가 쓴 : 더 "문제"질의하고 내가 여기에 그 중 하나를 쓴 것입니다 우리가 알고 는 포스트 그레스의 쿼리는 다음과 같은 것을 (나는 불필요한 잘라 것)입니다 :

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"}]) 

내가 여기서 묻는 것은 더 잘 작성해야합니다. 아니면 동일한 결과를 얻는 더 좋은 방법이있을 수 있습니까? 우리가 사용할 수있는 다른 최적화가 있습니까? 실제 DB는이 컬렉션에서만 200.000.000과 같은 데이터를 가져야하므로 최적의 응답 시간이 필요합니다 ... 1000 레코드 (station)와 6400 (measurement_daily) 레코드/문서가 각각 2 개인 테이블이 여기에 있습니다. 응답 시간으로 3,5-4s (Postgres) 대 30-32s (MongoDB)를 ... (두 시스템의 성능을 테스트하려면 쿼리가 200 번 반복됩니다. 따라서 우리는 3,5-4 및 30 -32s 어떤 도움이 정말 감사합니다 각각 하나 개의 쿼리) 외부 요인에 의해 조절을 최소화하기 위해 "동종"응답 시간을 가질.) ...에 대한

답변

2

달러 (A $)의 언 와인드 즉시 또 다른 $ 조회를 다음과 때 mongoDB documentation에 따르면, 및 $ unwind는 $ lookup의 as 필드에서 작동하고, optimizer는 $ unwind를 합체 할 수 있습니다 $ 조회 단계로. 이렇게하면 큰 중간 문서를 작성할 필요가 없습니다. 귀하의 경우에는

는 다음과 같이 표시됩니다

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