sql >> Base de Datos >  >> NoSQL >> MongoDB

$push usó demasiada memoria y no puede volcarse al disco. Límite de memoria:104857600 bytes

Entonces, después de tanto luchar, esto es lo que hice para resolver mi problema. Lo primero que se entendió fue que no puedo insertar los datos en una matriz sin limitarlos. Así que usé $limit y $skip , antes de agrupar los datos en la canalización (esto también mantiene la paginación de mi consulta). Pero el problema era mantener el recuento total de registros, ya que se perdió debido al límite antes de agrupar. Entonces, la solución que descubrí es usar $facet , que me ayuda a implementar dos canalizaciones dentro de la misma canalización de agregación.

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

Espero que esto ayude a otros. Salud :)