Я пытаюсь взять выдержку из огромной коллекции 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'}}])
Любые идеи / предложения о том, как улучшить этот запрос, будут очень полезны - заранее спасибо!