Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

206
Vistas
Conjuntos anidados planos de agregación de Mongo

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

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Trabajando suponiendo que FieldA en su ejemplo es un marcador de posición que podría ser varios campos o nombres diferentes, podría

  • $proyecto para combinar la facturación de nivel Billings con la matriz de $extras
  • desenrolle Extras y Billings para que cada documento contenga solo una
  • Agregue ProjectId y ExtraId al objeto de facturación
  • Promover el documento de Billings 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" }} ])

Patio de recreo

over 4 years ago · Santiago Trujillo Denunciar

0

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

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda