MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

$push hat zu viel Speicher verwendet und kann nicht auf die Festplatte übertragen werden. Speicherlimit:104857600 Bytes

Also, nach so viel Kampf, hier ist, was ich getan habe, um mein Problem zu lösen. Als erstes wurde verstanden, dass ich die Daten nicht in ein Array schieben kann, ohne es einzuschränken. Also habe ich $limit verwendet und $skip , bevor die Daten in der Pipeline gruppiert werden. (Dies behält auch die Paginierung für meine Abfrage bei). Das Problem bestand jedoch darin, die Gesamtanzahl der Datensätze beizubehalten, da sie aufgrund der Begrenzung vor der Gruppierung verloren gegangen sind. Die Lösung, die ich herausgefunden habe, besteht darin, $facet zu verwenden , was mir hilft, zwei Pipelines innerhalb derselben Aggregationspipeline zu implementieren.

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

Hoffe, das wird anderen helfen. Prost :)