сложность агрегации в MongoDB - PullRequest
0 голосов
/ 22 мая 2018

У меня есть запрос, который группирует результаты (большой набор данных ~ = 11Gb) по значению (vessel_id) и возвращает для каждого судна координаты в массиве.

Запрос выглядит так:

pipeline = [{"$group": {"_id": "$properties.vessel_id",
            "COORDINATES": {                                                                    
            "$push": "$geometry.coordinates"}}}]                                                        


getPositionsOfshipsgrouped = db.samplecol.aggregate(pipeline, allowDiskUse=True)

Вывод:

{u'_id': u'566679000', u'COORDINATES': [[154.666, -16.643], [154.666, -16.643], [154.666, -16.643]]}

{u'_id': u'636015725', u'COORDINATES': [[151.5162, -9.44365], [151.5162, -9.44365], [151.5162, -9.44365]]}

{u'_id': u'525018017', u'COORDINATES': [[117.3803, -1.029925], [117.3803, -1.029925], [117.3803, -1.029925]]}

Всего набор данных содержит 41000 vessel_id.Я заметил, что время для получения выходных данных для всех судов почти равно времени для извлечения выходных данных для 500 судов.

Например, время для выполнения запроса с помощью $limit:500 почти равно временивыполнить запрос с помощью $limit:41000:

pipeline = [{"$group": {"_id": "$properties.vessel_id",
                "COORDINATES": {                                                                    
                "$push": "$geometry.coordinates"}}},
                 {"$limit":500}]                                                        


getPositionsOfshipsgrouped = db.samplecol.aggregate(pipeline, allowDiskUse=True)

Время : 720 сек

pipeline = [{"$group": {"_id": "$properties.vessel_id",
                "COORDINATES": {                                                                    
                "$push": "$geometry.coordinates"}}},
                 {"$limit":41000}]                                                        


getPositionsOfshipsgrouped = db.samplecol.aggregate(pipeline, allowDiskUse=True)

Время : 780 сек

Что мне здесь не хватает?Что-то я не так делаю?

1 Ответ

0 голосов
/ 22 мая 2018

см. Пример

db.collection.distinct('vessel_id').limit(10000)

db.collection.aggregate([
  { $match: { vessel_id: vessel_id }},
  {"$group": {"_id": "$properties.vessel_id",
                "COORDINATES": {                                                                    
                "$push": "$geometry.coordinates"}}}
])
...