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

353
Vistas
¿Cómo puedo realizar "uniones" anidadas (unir 3 o más colecciones) en una canalización de agregación de MongoDB?

Digamos que tenemos 3 colecciones hipotéticas en MongoDB: customers , orders y artículos de orderItems .

Cada cliente tiene varios pedidos y cada pedido tiene varios artículos de pedido.

Aquí hay algunos datos de muestra para estas 3 colecciones:

clientes

 [ { customer_id: 1, name: "Jim Smith", email: "jim.smith@example.com" }, { customer_id: 2, name: "Bob Jones", email: "bob.jones@example.com" } ]

pedidos

 [ { order_id: 1, customer_id: 1 }, { order_id: 2, customer_id: 1 } ]

encargar artículos

 [ { order_item_id: 1, name: "Foo", price: 4.99, order_id: 1 }, { order_item_id: 2, name: "Bar", price: 17.99, order_id: 1 }, { order_item_id: 3, name: "baz", price: 24.99, order_id: 2 } ]

Resultado deseado

¿Cómo puedo escribir mi tubería de agregación para que el resultado devuelto se vea así?

 [ { customer_id: 1, name: "Jim Smith", email: "jim.smith@example.com" orders: [ { order_id: 1, items: [ { name: "Foo", price: 4.99 }, { name: "Bar", price: 17.99 } ] }, { order_id: 2, items: [ { name: "baz", price: 24.99 } ] } ] }, { customer_id: 2, name: "Bob Jones", email: "bob.jones@example.com" orders: [] } ]
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Realice una búsqueda anidada mediante la búsqueda con canalización ,

  • $lookup con colección de orders ,
    • let , defina la variable customer_id que es de la colección principal, para acceder a esta variable de referencia dentro de la canalización usando $$ como $$customer_id ,
    • pipeline puede agregar etapas de canalización de la misma manera que lo hacemos en la canalización de nivel raíz
    • $expr cada vez que hacemos coincidir campos internos, requiere una condición de coincidencia de expresión, por lo que $$customer_id es el campo de la colección principal que se declaró en let y $customer_id es el campo de la colección secundaria/colección actual
  • $lookup con colección de artículos de orderitems
 db.customers.aggregate([ { $lookup: { from: "orders", let: { customer_id: "$customer_id" }, pipeline: [ { $match: { $expr: { $eq: ["$$customer_id", "$customer_id"] } } }, { $lookup: { from: "orderitems", localField: "order_id", foreignField: "order_id", as: "items" } } ], as: "orders" } } ])

Patio de recreo


Consejo:

Varias uniones consideradas como malas prácticas en NoSQL, sugeriría que si pudiera agregar sus artículos de pedido en la colección de pedidos como matriz, puede guardar un proceso de unión para los artículos de pedido, vea la versión mejorada en el patio de recreo

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