Estoy usando Bucket Pattern para dividir una serie temporal de actualizaciones de mercado y evitar exceder el tamaño del documento (los gastos generales de transferencia no son una preocupación). Cada documento tiene 30,000 actualizaciones y necesito devolver esas actualizaciones de todos los documentos que coincidan con 'marketId' en una matriz (con suerte ordenados).
Datos:
{ _id: 60617172eca858909eace71f, marketId: '1.278363651', eventId: 5697224, marketType: 'OVER_UNDER_15', size: 30000, updates: [ { t: 1616998770482.0, p: 36.49 }, { t: 1616998770482, p: 87.77 }, // ... 29998 more ] },Resultado deseado:
[ { t: 1616998770482, p: 36.49 }, { t: 1616998770482, p: 16.59 }, { t: 1616998770482, p: 40.38 }, ... // sorted by t }Este es mi intento más cercano con una agregación:
const result = await db.collection('markets').aggregate( { $match: { marketId: marketId } }, { $project: { _id: 0, updates: 1 } }, { $unwind: "$updates" }, { $unwind: "$updates" }, ).toArray();Producción:
[ { updates: { t: 1616998770482, p: 36.49 } }, { updates: { t: 1616998770482, p: 16.59 } }, { updates: { t: 1616998770482, p: 40.38 } }, ... // actually gives me all of them }¿Cómo puedo eliminar las "actualizaciones" y llegar al objeto real?
Demostración: https://mongoplayground.net/p/Dw7NAn9EoEd
Usar $replaceRoot
db.collection.aggregate([ { $match: { marketId: marketId } }, { $project: { _id: 0, updates: 1 }}, { $unwind: "$updates" }, { $replaceRoot: { newRoot: "$updates" } } ])