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:
[ { customer_id: 1, name: "Jim Smith", email: "jim.smith@example.com" }, { customer_id: 2, name: "Bob Jones", email: "bob.jones@example.com" } ] [ { order_id: 1, customer_id: 1 }, { order_id: 2, customer_id: 1 } ] [ { 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 } ]¿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: [] } ]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" } } ])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