Use uma visualização para participar de duas collections
Você pode usar $lookup
para criar uma visualização em duas coleções e, em seguida, executar queries na visualização. Os aplicativos podem consultar a visualização sem precisar criar ou manter pipelines complexos.
Exemplo
Crie duas collections de amostra, inventory
e orders
:
db.inventory.insertMany( [ { prodId: 100, price: 20, quantity: 125 }, { prodId: 101, price: 10, quantity: 234 }, { prodId: 102, price: 15, quantity: 432 }, { prodId: 103, price: 17, quantity: 320 } ] ) db.orders.insertMany( [ { orderId: 201, custid: 301, prodId: 100, numPurchased: 20 }, { orderId: 202, custid: 302, prodId: 101, numPurchased: 10 }, { orderId: 203, custid: 303, prodId: 102, numPurchased: 5 }, { orderId: 204, custid: 303, prodId: 103, numPurchased: 15 }, { orderId: 205, custid: 303, prodId: 103, numPurchased: 20 }, { orderId: 206, custid: 302, prodId: 102, numPurchased: 1 }, { orderId: 207, custid: 302, prodId: 101, numPurchased: 5 }, { orderId: 208, custid: 301, prodId: 100, numPurchased: 10 }, { orderId: 209, custid: 303, prodId: 103, numPurchased: 30 } ] )
Criar uma visualização conjunta
Este comando utiliza db.createView()
para criar uma nova visualização denominada sales
com base na collection orders
:
db.createView( "sales", "orders", [ { $lookup: { from: "inventory", localField: "prodId", foreignField: "prodId", as: "inventoryDocs" } }, { $project: { _id: 0, prodId: 1, orderId: 1, numPurchased: 1, price: "$inventoryDocs.price" } }, { $unwind: "$price" } ] )
No exemplo:
O estágio
$lookup
usa o campoprodId
na collectionorders
para "unir" documentos na collectioninventory
que tenham camposprodId
correspondentes.Os documentos correspondentes são adicionados como uma array no campo
inventoryDocs
.O estágio
$project
seleciona um subconjunto dos campos disponíveis.O estágio
$unwind
converte o campoprice
de uma array para um valor escalar.
Os documentos na visualização sales
são:
{ orderId: 201, prodId: 100, numPurchased: 20, price: 20 }, { orderId: 202, prodId: 101, numPurchased: 10, price: 10 }, { orderId: 203, prodId: 102, numPurchased: 5, price: 15 }, { orderId: 204, prodId: 103, numPurchased: 15, price: 17 }, { orderId: 205, prodId: 103, numPurchased: 20, price: 17 }, { orderId: 206, prodId: 102, numPurchased: 1, price: 15 }, { orderId: 207, prodId: 101, numPurchased: 5, price: 10 }, { orderId: 208, prodId: 100, numPurchased: 10, price: 20 }, { orderId: 209, prodId: 103, numPurchased: 30, price: 17 }
Consultar a visualização
Para encontrar o valor total vendido de cada produto, consulte a visualização:
db.sales.aggregate( [ { $group: { _id: "$prodId", amountSold: { $sum: { $multiply: [ "$price", "$numPurchased" ] } } } } ] )
A saída é:
[ { _id: 102, amountSold: 90 }, { _id: 101, amountSold: 150 }, { _id: 103, amountSold: 1105 }, { _id: 100, amountSold: 600 } ]