Takže, po tolika boji, tady je to, co jsem udělal, abych vyřešil svůj problém. První věc byla pochopit, že nemohu vložit data do pole, aniž bych je omezil. Použil jsem tedy $limit
a $skip
, před seskupením dat v kanálu. (Tím se také zachová stránkování mého dotazu). Ale problém byl udržet celkový počet záznamů, protože byly ztraceny kvůli limitu před seskupením. Takže řešení, na které jsem přišel, je použít $facet
, což mi pomáhá při implementaci dvou kanálů v rámci stejného agregačního kanálu.
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 })
Doufám, že to pomůže ostatním. Na zdraví :)