«$ pu sh использует слишком много памяти и не может пролиться на диск. Ограничение памяти: 104857600 байт» - PullRequest
2 голосов
/ 13 января 2020

Я отправляю запрос на получение из приложения и получаю указанную ниже ошибку:

{"$push used too much memory and cannot spill to disk. Memory limit: 104857600 bytes"}

Я использую управляемый атлас mon go -db с 4 ГБ оперативной памяти и 20 ГБ для хранения. Я думаю, мне нужно обновить некоторые настройки конфигурации, но мне не хватает этого. Может ли кто-нибудь помочь мне решить эту ошибку.

Добавление запроса

    db.collection1.aggregate([ { '$match': {} }, { '$lookup': { from: 'collection2', localField: 'pfId', foreignField: 'pfId', as: 'pt' } }, { '$unwind': '$pt' }, { '$match': {} }, { '$lookup': { from: 'collection3', localField: 'pt.ptId', foreignField: 'ptId', as: 'pd' } }, { '$unwind': '$pd' }, { '$match': {} }, { '$lookup': { from: 'collection4', localField: 'pd.pdId', foreignField: 'pdId', as: 'dl' } }, { '$unwind': '$dl' }, { '$match': { 'dl.currentdl': { '$ne': 'OBSOLETE' }, '$or': [ { 'pd.pdName': { '$regex': /^.*world.*/i } }, { 'dl.r.dF': { '$regex': /^.*world.*/i } }, { 'dl.dlType': { '$regex': /^.*world.*/i } }, { 'dl.dlId': 'WORLD' }, { 'dl.logUserId': 'WORLD' } ] } }, { '$project': {//some_fields} }, { '$group': { _id: null, count: { '$sum': 1 }, results: { '$push': '$$ROOT' } } }, { '$project': { count: 1, results: { '$slice': [ '$results',
0, 10 ] } } }], { allowDiskUse: true })

Я должен разбить данные на страницы, а также получить счетчик полученных данных.

1 Ответ

0 голосов
/ 21 января 2020

Итак, после такой большой борьбы, вот что я сделал, чтобы решить мою проблему. Первым делом стало понятно, что я не могу поместить sh данные в массив, не ограничивая его. Поэтому я использовал $limit и $skip перед группировкой данных в конвейере (это также поддерживает разбиение на страницы для моего запроса). Но проблема состояла в том, чтобы сохранить общее количество записей, поскольку они были потеряны из-за ограничения перед группировкой. Итак, решение, которое я нашел, заключается в использовании $facet, который помогает мне реализовать два конвейера в одном и том же конвейере агрегации.

db.prdfam.aggregate([{
$facet: {
"counts":[
{ '$match': {} },
{ '$lookup': { from: 'pt', localField: 'pfId', foreignField: 'pfId', as: 'pt' } },
{ '$unwind': '$pt' }, { '$match': {} }, 
{ '$lookup': { from: 'prds', localField: 'pt.ptId', foreignField: 'ptId', as: 'prd' } },
{ '$unwind': '$prd' }, { '$match': {} }, 
{ '$lookup': { from: 'del', localField: 'prd.prdId', foreignField: 'prdId', as: 'delivery' } }, 
{ '$unwind': '$delivery' }, { '$match': { 'delivery.currentDelivery': { '$ne': 'OBSOLETE' }, 
'$or': [ { 'prd.prdName': { '$regex': /^.*world.*/i } },
{ 'delivery.rInfo.dataFormat': { '$regex': /^.*world.*/i } },
{ 'delivery.dType': { '$regex': /^.*world.*/i } }, 
{ 'delivery.dId': 'WORLD' }, { 'delivery.UserId': 'WORLD' } ] } }, 
{ '$group': { _id: null, count: { '$sum': 1 } } }
],
"results":[
//same lookup & match conditions as in above element 
{ '$project': { //fields to project } }, 
{ '$sort': { updatedAt: -1 } }, {$skip: 0},{ $limit : 10 },
{ '$group': { _id: null, results: { '$push': '$$ROOT' } } },
{ '$project': { results: 1 } }
]
}
}], 
{ allowDiskUse: true })

Надеюсь, это поможет другим. Ура:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...