Tengo esta estructura en Mongo:
[ { ProjectId: 111, Billings: [ { FieldA: 1 }, { FieldA: 2 } ], Extras: [ { ExtraId: "E_111_01", Billings: [ { FieldA: 3 }, { FieldA: 4 } ] }, { ExtraId: "E_111_02", Billings: [ { FieldA: 5 }, { FieldA: 6 } ] } ] }, { ProjectId: 222, Billings: [], Extras: [ { ExtraId: "E_222_01", Billings: [ { FieldA: 7 }, { FieldA: 8 } ] } ] } ]Necesito aplanar todos los 'Billings' para rootear, pero algunos de ellos están en una matriz de primer nivel y otros están 2 niveles por debajo.
Y el proceso debe agregar 2 accesorios a 'Facturación', la ID del proyecto de la que proviene, y si es un Extra, la 'Facturación' debe tener la ID del Proyecto y la ID Extra.
¿Cómo puedo aplanar todo para rootear? Simplemente relájese 2 veces y MergeArray? para enviar los ID a Billings, ¿debería usar MAP?
En este ejemplo el resultado sería:
[ { ProjectId: 111, FieldA: 1 }, { ProjectId: 111, FieldA: 2 } { ProjectId: 111, ExtraId: "E_111_01", FieldA: 3 }, { ProjectId: 111, ExtraId: "E_111_01", FieldA: 4 } { ProjectId: 111, ExtraId: "E_111_01", FieldA: 5 }, { ProjectId: 111, ExtraId: "E_111_01", FieldA: 6 } { ProjectId: 222, ExtraId: "E_222_01", FieldA: 7 }, { ProjectId: 222, ExtraId: "E_222_01", FieldA: 8 } ]Aquí hay un parque infantil Mongo
salud
Trabajando suponiendo que FieldA en su ejemplo es un marcador de posición que podría ser varios campos o nombres diferentes, podría
Billings con la matriz de $extrasExtras y Billings para que cada documento contenga solo unaProjectId y ExtraId al objeto de facturaciónBillings para que sea la raíz Esto mantendrá todos los campos en cada documento de Billings y no requerirá que conozca los nombres de los campos con anticipación.
db.collection.aggregate([ {"$project": { _id: 0, ProjectId: 1, Extras: { $concatArrays: [ [{ Billings: "$Billings" }], "$Extras" ] } }}, {$unwind: "$Extras"}, {$unwind: "$Extras.Billings"}, {$addFields: { "Extras.Billings.ExtraId": "$Extras.ExtraId", "Extras.Billings.ProjectId": "$ProjectId" }}, {$replaceRoot: { newRoot: "$Extras.Billings" }} ])podría probar esta consulta de agregación:
db.collection.aggregate([ { "$unwind": "$Extras" }, { "$addFields": { "Extras.Billings.ExtraId": "$Extras.ExtraId" } }, { "$project": { "ProjectId": "$ProjectId", "Billings": { "$concatArrays": [ "$Billings", "$Extras.Billings" ] } } }, { "$unwind": "$Billings" }, { "$project": { "ProjectId": "$ProjectId", "FieldA": "$Billings.FieldA", "ExtraId": "$Billings.ExtraId" } }, { "$group": { "_id": { "id": "$_id", "FieldA": "$FieldA", "ProjectId": "$ProjectId", "ExtraId": "$ExtraId" } } }, { "$project": { "_id": 0, "FieldA": "$_id.FieldA", "ProjectId": "$_id.ProjectId", "ExtraIs": "$_id.ExtraId" } }, { "$sort": { "ProjectId": 1, "FieldA": 1 } } ])Pruébelo en línea: mongoplayground.net/p/DZAIfDY5x7L