Как улучшить производительность этого запроса MongoDB - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь взять выдержку из огромной коллекции MongoDB.

В частности, сборник содержит 2,65 ТБ данных (в разархивированном виде), то есть 600 ГБ данных (в архиве). У каждого документа есть глубокая иерархия и пара массивов, и я хочу извлечь из них некоторые части. В этой коллекции у нас есть несколько документов для каждого идентификатора клиента. Поскольку я хочу экспортировать наиболее активный документ для каждого клиента, мне нужно сгруппировать и взять записи с полем максимального времени и выполнить некоторую дальнейшую обработку для них. Мне нужна помощь в формировании запроса на экспорт. Я попытался отсортировать документы по идентификатору клиента, но этого не удалось достичь за приемлемое время в сочетании с конструкцией «match» (это необходимо, поскольку это огромная коллекция, и мы пытаемся создать экспорт по частям). В настоящее время запрос выглядит следующим образом:

db.getCollection('CEM').aggregate([
    {'$match' : {'LiveFeed.customer.profile.id':'TCAYT2RY2PF93R93JVSUGU7D3'}},
    {'$project':{'LiveFeed.customer.profile.id':1,'LiveFeed.customer.profile.products.air.flights':1, 'LiveFeed.context.timestamp':1}},
    {'$sort':{'LiveFeed.customer.profile.id':1,"LiveFeed.context.timestamp":1}},
    {'$group':{'_id':'$LiveFeed.customer.profile.id',
      'products':{'$last':'$LiveFeed.customer.profile.products.air.flights'}}},
    {'$unwind': '$products'},
    {'$unwind': '$products.sources'},
    {'$project':{'_id':0,
        'ceid': '$_id',
        'coupon_no':{'$ifNull':['$products.couponId.couponNumber', ""]},
        'ticket_no':{'$ifNull':['$products.couponId.ticketId.number','']},
        'pnr_id':'$products.sources.id',
        'departure_date':'$products.segment.departure.at',
        'departure_airport':'$products.segment.departure.code',
        'arrival_airport':'$products.segment.arrival.code',
        'created_date':'$products.createdAt'}}])

Любые идеи / предложения о том, как улучшить этот запрос, будут очень полезны - заранее спасибо!

1 Ответ

0 голосов
/ 30 апреля 2020

Трудно ответить на это, не зная индексов в вашей коллекции. Однако вы можете сэкономить время, исключив этап 3. Сортировка $ отменена группой $ на этапе 4. См. $ group не сохраняет порядок

...