Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

355
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!