Você está na página 1de 19

Instituto Federal da Bahia – IFBA Página 1 de 19

Campus Vitória da Conquista

Curso: Pós-Graduação Lato Sensu em Desenvolvimento Web


4ª Lista de Exercícios (BD e-Commerce) – 11 Questões
Disciplina: Módulo: Professor:
Banco de Dados para a Web I Pablo Freire Matos
Assunto: Data:
Consultas em Documentos com MongoDB 18/10/2019
Aluno (a): Turma:
GABARITO Única
Utiliza os métodos aggregate() e/ou find() para realizar as consultas a seguir.
Observação: Utilizar a base de dados e-Commerce disponível no Google Drive.
1. Quais os nomes dos produtos não têm nenhuma venda?
Consulta no MySQL:
SELECT nome
FROM produto
WHERE codProduto != ALL (
SELECT DISTINCT codProduto
FROM venda
);
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:

a) Responder com “subconsulta”: utilizar cursor.


var resultado = db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$group:{_id:"", produtos:{$addToSet:"$itemComprado.produto_id"}}}
]);
if(resultado.hasNext()){
var ids = resultado.next().produtos;
db.produto.find(
{_id:{$nin:ids}},
{nome:1,_id:0}
);
}
Ou
var resultado = db.pedido.distinct('itemComprado.produto_id');
if(resultado.hasNext()){
var ids = resultado.next().produtos;
db.produto.find(
{_id:{$nin:ids}},
{nome:1,_id:0}
);
}
Instituto Federal da Bahia – IFBA Página 2 de 19
Campus Vitória da Conquista

b) Responder com “junção”: utilizar o operador $lookup.


db.produto.aggregate([
{$match:{"itemComprado":{$exists:false}}},
{$lookup:{
from:"pedido",
localField:"_id",
foreignField: "itemComprado.produto_id",
as:"produtos"
}},
{$project:{
_id:0,
tamanho:{$size:"$produtos"},
nome:1
}},
{$match:{tamanho:0}},
{$project:{tamanho:0}}
]);
Instituto Federal da Bahia – IFBA Página 3 de 19
Campus Vitória da Conquista

2. Qual a quantidade de pedidos aprovados por tipo de cliente (pessoa física e jurídica)?
Consulta no MySQL:
SELECT b.tipoCliente, COUNT(*)QtdPedido
FROM pedido a
JOIN cliente b ON a.codCliente = b.codCliente
WHERE a.status = "aprovado"
GROUP BY b.tipoCliente;
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:

Consulta em MongoDB o operador $lookup:


db.pedido.aggregate([
{$match:{status:"aprovado"}},
{$lookup:{
from:"cliente",
localField:"cliente_id",
foreignField: "_id",
as:"clientes"
}},
{$unwind:"$clientes"},
{$group:{
_id:"$clientes.tipoCliente",
qtdPedido:{$sum: NumberInt(1)}
}}
]).toArray();
Instituto Federal da Bahia – IFBA Página 4 de 19
Campus Vitória da Conquista

3. Quais os pedidos não têm nenhuma associação com venda (“itemComprado”)? Mostrar o código, o ano e
o status do pedido e também o nome e o tipo do cliente.
Consulta no MySQL:
SELECT a.codPedido, YEAR(a.data) Ano,
a.status, b.nome Cliente, b.tipoCliente
FROM pedido a
JOIN cliente b ON a.codCliente = b.codCliente
WHERE a.codPedido != ALL (
SELECT codPedido
FROM venda
);
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:


Instituto Federal da Bahia – IFBA Página 5 de 19
Campus Vitória da Conquista

Consulta em MongoDB com o operador $lookup:


db.pedido.aggregate([
{$match:{"itemComprado":{$exists:false}}},
{$lookup:{
from:"cliente",
localField:"cliente_id",
foreignField: "_id",
as:"clientes"
}},
{$unwind:"$clientes"},
{$addFields:{
cliente:"$clientes.nome",
tipoCliente:"$clientes.tipoCliente"
}},
{$project:{
ano:{$year:"$data"},
status:1,
cliente:1,
tipoCliente:1
}}
]).toArray();

Ou
// SOLUÇÃO DANILO AZEVEDO
db.pedido.aggregate([
{$match:{itemComprado:{$exists:false}}},
{$lookup:{
from:"cliente",
localField:"cliente_id",
foreignField: "_id",
as:"clientes"
}},
{$unwind:"$clientes"},
{$project:{
ano:{$year:"$data"},
status:1,
cliente:"$clientes.nome",
tipoCliente:"$clientes.tipoCliente"
}}
]).toArray();
Instituto Federal da Bahia – IFBA Página 6 de 19
Campus Vitória da Conquista

4. Qual o produto vendido que teve mais troca em 2016? Informar além do código e do nome do produto, a
quantidade de troca do produto.
Consulta no MySQL:
SELECT b.codProduto, b.nome, SUM(a.quantidade) QuantidadeTroca
FROM trocaproduto a
JOIN produto b on b.codProduto = a.codProdutoVenda
WHERE YEAR(a.dataTroca) = '2016'
GROUP BY a.codProdutoVenda
HAVING QuantidadeTroca >= ALL (
SELECT SUM(a.quantidade) qtd
FROM trocaproduto a
WHERE YEAR(a.dataTroca) = '2016'
GROUP BY a.codProdutoVenda
);
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:


Instituto Federal da Bahia – IFBA Página 7 de 19
Campus Vitória da Conquista

Consulta em MongoDB com cursor e o operador $lookup:


var resultado = db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$project:{
ano:{$year:"$itemComprado.itemTrocado.dataTroca"},
"itemComprado.produto_id":1,
"itemComprado.itemTrocado.produto_id":1,
"itemComprado.itemTrocado.quantidade":1
}},
{$match:{ano:{$eq:2016}}},
{$group:{
_id:"$itemComprado.produto_id",
quantidadeTroca:{$sum:"$itemComprado.itemTrocado.quantidade"}
}},
{$group:{
_id:"",
maximo:{$max:"$quantidadeTroca"}
}}
]);

if(resultado.hasNext()){
var res = resultado.next();
db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$project:{
ano:{$year:"$itemComprado.itemTrocado.dataTroca"},
"itemComprado.produto_id":1,
"itemComprado.itemTrocado.produto_id":1,
"itemComprado.itemTrocado.quantidade":1
}},
{$match:{ano:{$eq:2016}}},
{$group:{
_id:"$itemComprado.produto_id",
quantidadeTroca:{$sum:"$itemComprado.itemTrocado.quantidade"}
}},
{$match:{quantidadeTroca:{$eq:res.maximo}}},
{$lookup:{
from:"produto",
localField:"_id",
foreignField:"_id",
as:"produtos"
}},
{$unwind:"$produtos"},
{$project:{
"produtos.nome":1,
quantidadeTroca:1
}}
]);
}
Instituto Federal da Bahia – IFBA Página 8 de 19
Campus Vitória da Conquista

5. Qual o percentual de produto vendido foi trocado? Mostrar o percentual com somente duas casas
decimais. Utilizar o operador $trunc.
Consulta no MySQL:
SELECT TRUNCATE(QtdTroca/TotalVenda*100, 2) PercentualPedProdVendido
FROM (
SELECT COUNT(*) QtdTroca
FROM TrocaProduto
)T1,
(SELECT COUNT(*) TotalVenda
FROM Venda
)T2;
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:

Consulta em MongoDB com cursor:


var venda = db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$count: "total"}
]);

if(venda.hasNext()){
var v = venda.next().total;
db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$match:{"itemComprado.itemTrocado":{$exists:true}}},
{$count: "total"},
{$project:{_id:0, d:{$divide:["$total", v]}}},
{$project:{m:{$multiply:["$d", 100]}}},
{$project:{res:{$trunc:["$m", 2]}}}
]);
}
Instituto Federal da Bahia – IFBA Página 9 de 19
Campus Vitória da Conquista

6. Quais produtos vendidos têm pelo menos uma troca? Informar o código e o nome do produto.
Consulta no MySQL:
SELECT codProduto, nome
FROM Produto
WHERE codProduto = ANY(
SELECT codProdutoVenda
FROM TrocaProduto
);
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:


Instituto Federal da Bahia – IFBA Página 10 de 19
Campus Vitória da Conquista

Consulta em MongoDB com o operador $lookup:


db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$match:{"itemComprado.itemTrocado":{$exists:true}}},
{$project:{
"itemComprado.produto_id":1,
"itemComprado.itemTrocado.produto_id":1,
"itemComprado.itemTrocado.quantidade":1
}},
{$group:{
"_id":"$itemComprado.produto_id",
"total":{"$sum":NumberInt(1)}
}},
{$lookup:{
from:"produto",
localField:"_id",
foreignField:"_id",
as:"produtos"
}},
{$unwind:"$produtos"},
{$project:{
_id:0,"produtos._id":1,
"produtos.nome":1, "produtos.total":1
}},
{$sort:{"produtos._id":1}}
]).toArray();
Instituto Federal da Bahia – IFBA Página 11 de 19
Campus Vitória da Conquista

7. Quais produtos vendidos têm pelo menos duas trocas? Informar o código, o nome do produto e a
quantidade de troca.
Consulta no MySQL:
SELECT b.codProduto, b.nome, COUNT(*) QuantidadeTroca
FROM trocaproduto a
JOIN produto b on b.codProduto = a.codProdutoVenda
GROUP BY a.codProdutoVenda
HAVING QuantidadeTroca >=2;
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:


Instituto Federal da Bahia – IFBA Página 12 de 19
Campus Vitória da Conquista

Consulta em MongoDB com o operador $lookup:


db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$match:{"itemComprado.itemTrocado":{$exists:true}}},
{$project:{
"itemComprado.produto_id":1,
"itemComprado.itemTrocado.produto_id":1,
"itemComprado.itemTrocado.quantidade":1
}},
{$group:{"_id":"$itemComprado.produto_id","total":{"$sum":NumberInt(1)}}},
{$match:{"total":{$gte:2}}},
{$lookup:{
from:"produto",
localField:"_id",
foreignField:"_id",
as:"produtos"
}},
{$unwind:"$produtos"},
{$addFields:{"produtos.quantidadeTroca":"$total"}},
{$project:{
_id:0,"produtos._id":1,
"produtos.nome":1, "produtos.quantidadeTroca":1
}},
{$sort:{"produtos._id":1}}
]).toArray();

Ou

db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$match:{"itemComprado.itemTrocado":{$exists:true}}},
{$project:{
"itemComprado.produto_id":1,
"itemComprado.itemTrocado.produto_id":1,
"itemComprado.itemTrocado.quantidade":1
}},
{$group:{"_id":"$itemComprado.produto_id","total":{"$sum":NumberInt(1)}}},
{$match:{"total":{$gte:2}}},
{$lookup:{
from:"produto",
localField:"_id",
foreignField:"_id",
as:"produtos"
}},
{$unwind:"$produtos"},
{$project:{
_id:0,"produtos._id":1,
"produtos.nome":1, "produtos.quantidadeTroca":"$total"
}},
{$sort:{"produtos._id":1}}
]).toArray();
Instituto Federal da Bahia – IFBA Página 13 de 19
Campus Vitória da Conquista

Ou

// SOLUÇÃO MAURÍCIO
db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$match:{"itemComprado.itemTrocado":{$exists:true}}},
{$group:{
"_id":"$itemComprado.produto_id",
"qtd":{"$sum":NumberInt(1)}
}},
{$redact:{
$cond:{
if:{$gte:["$qtd",2]},
then:"$$KEEP",
else:"$$PRUNE"
}
}},
{$lookup:{
from:"produto",
localField:"_id",
foreignField:"_id",
as:"produtos"
}},
{$unwind:"$produtos"},
{$set:{"produtos.quantidadeTroca":{$toInt:"$qtd"}}},
{$project:{
_id:0,"produtos._id":1,
"produtos.nome":1, "produtos.quantidadeTroca":1
}}
]);
Instituto Federal da Bahia – IFBA Página 14 de 19
Campus Vitória da Conquista

8. Qual é o produto mais vendido entre Fevereiro e Novembro de 2016? Informar além do código e do
nome do produto, a quantidade vendida.
Consulta no MySQL:
SELECT c.codProduto, c.nome, SUM(a.quantidade) qtdVendido
FROM Venda a
JOIN Pedido b ON a.codPedido = b.codPedido
JOIN Produto c ON c.codProduto = a.codProduto
WHERE MONTH(data) BETWEEN 2 AND 11 AND YEAR(data) = '2016'
GROUP BY a.codProduto
HAVING qtdVendido >= ALL(
SELECT SUM(a.quantidade)
FROM Venda a
JOIN Pedido b ON a.codPedido = b.codPedido
WHERE MONTH(data) BETWEEN 2 AND 11 AND YEAR(data) = '2016'
GROUP BY a.codProduto
);
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:


Instituto Federal da Bahia – IFBA Página 15 de 19
Campus Vitória da Conquista

Consulta em MongoDB com cursor e o operador $lookup:


var resultado = db.pedido.aggregate([
{$project:{
ano:{$year:"$data"},
mes:{$month:"$data"},
"itemComprado.produto_id":1,
"itemComprado.quantidade":1
}},
{$match:{$and:[{ano:{$eq:2016}}, {mes:{$gte:2, $lte:11}}]}},
{$unwind:"$itemComprado"},
{$group:{
_id:"$itemComprado.produto_id",
total:{$sum:"$itemComprado.quantidade"}
}},
{$group:{
_id:"",
maximo:{$max:"$total"}
}}
]);

if(resultado.hasNext()){
var res = resultado.next();
db.pedido.aggregate([
{$project:{
ano:{$year:"$data"},
mes:{$month:"$data"},
"itemComprado.produto_id":1,
"itemComprado.quantidade":1
}},
{$match:{$and:[{ano:{$eq:2016}}, {mes:{$gte:2, $lte:11}}]}},
{$unwind:"$itemComprado"},
{$group:{
_id:"$itemComprado.produto_id",
total:{$sum:"$itemComprado.quantidade"}
}},
{$match:{total:{$eq:res.maximo}}},
{$lookup:{
from:"produto",
localField:"_id",
foreignField:"_id",
as:"produtos"
}},
{$unwind:"$produtos"},
{$addFields:{"produtos.qtdVendido":"$total"}},
{$project:{
"produtos._id":1,
"produtos.nome":1,
"produtos.qtdVendido":1,
_id:0
}}
]);
}
Instituto Federal da Bahia – IFBA Página 16 de 19
Campus Vitória da Conquista

9. Qual o total de pedidos de cada forma de pagamento entre 2015 e 2016?


Consulta no MySQL:
SELECT formaPagamento, COUNT(codPedido) Quantidade
FROM pedido
WHERE YEAR(data) BETWEEN 2015 AND 2016
GROUP BY formaPagamento;
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:

Consulta em MongoDB com o operador $group:


db.pedido.aggregate([
{$project:{
ano:{$year:"$data"},
"formaPagamento":1
}},
{$match:{ano:{$gte:2015, $lte:2016}}},
{$group:{_id:"$formaPagamento", quantidade:{$sum:NumberInt(1)}}}
]).toArray();
Instituto Federal da Bahia – IFBA Página 17 de 19
Campus Vitória da Conquista

10. Qual o código do pedido, o código de rastreamento e o nome do cliente dos pedidos com status “negado”
entre os anos de 2014 e 2017? Mostrar “inexistente” para o código de rastreamento nulo ou inexistente.
Consulta no MySQL:
SELECT a.codPedido, a.codRastreamento, b.nome
FROM Pedido a
JOIN Cliente b ON b.codCliente = a.codCliente
WHERE status = 'negado' AND YEAR(data) BETWEEN 2014 AND 2017;
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:

Consulta em MongoDB com o operador $lookup:


db.pedido.aggregate([
{$project:{
ano:{$year:"$data"},
"codRastreamento":1,
"status":1,
"cliente_id":1
}},
{$match:{$and:[{ano:{$gte:2014, $lte:2017}},{status:"negado"}]}},
{$project:{
codRastreamento:{$ifNull:["$codRastreamento","inexistente"]},
"cliente_id":1
}},
{$lookup:{
from:"cliente",
localField:"cliente_id",
foreignField: "_id",
as:"clientes"
}},
{$unwind:"$clientes"},
{$project:{codRastreamento:1, "clientes.nome":1}}
]).toArray();
Instituto Federal da Bahia – IFBA Página 18 de 19
Campus Vitória da Conquista

11. Qual cliente mais comprou produto entre 2016 e 2017? Informar o código e o nome do cliente, o tipo do
cliente (física ou jurídica) e a quantidade que comprou.
Consulta no MySQL:
SELECT a.codCliente, c.nome, c.tipoCliente,
SUM(b.quantidade)QtdPedidoComprado
FROM Pedido a
JOIN Venda b ON b.codPedido = a.codPedido
JOIN Cliente c ON c.codCliente = a.codCliente
WHERE a.status != 'negado' AND YEAR(a.data) BETWEEN 2016 AND 2017
GROUP BY a.codCliente
HAVING QtdPedidoComprado >= ALL (
SELECT SUM(b.quantidade) QtdPedidoComprado
FROM Pedido a
JOIN Venda b ON b.codPedido = a.codPedido
WHERE a.status != 'negado' AND YEAR(a.data) BETWEEN 2016 AND 2017
GROUP BY a.codCliente
);
Resultado da Consulta no MySQL:

Resultado da Consulta no MongoDB:


Instituto Federal da Bahia – IFBA Página 19 de 19
Campus Vitória da Conquista

Consulta em MongoDB com cursor e o operador $lookup:


var resultado = db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$project:{
ano:{$year:"$data"},
status:1,
"cliente_id":1,
"itemComprado.quantidade":1
}},
{$match:{$and:[{ano:{$gte:2016, $lte:2017}},{status:{$ne:"negado"}}]}},
{$group:{
_id:"$cliente_id",
qtdItemComprado:{$sum:"$itemComprado.quantidade"}
}},
{$group:{
_id:"",
maximo:{$max:"$qtdItemComprado"}
}}
]);
if(resultado.hasNext()){
var res = resultado.next();
db.pedido.aggregate([
{$unwind:"$itemComprado"},
{$project:{
ano:{$year:"$data"},
status:1,
"cliente_id":1,
"itemComprado.quantidade":1
}},
{$match:{$and:[{ano:{$gte:2016, $lte:2017}},{status:{$ne:"negado"}}]}},
{$group:{
_id:"$cliente_id",
qtdItemComprado:{$sum:"$itemComprado.quantidade"}
}},
{$match:{qtdItemComprado:{$eq:res.maximo}}},
{$lookup:{
from:"cliente",
localField:"_id",
foreignField: "_id",
as:"clientes"
}},
{$unwind:"$clientes"},
{$addFields:{"clientes.qtdPedidoComprado":"$qtdItemComprado"}},
{$project:{
_id:0,
"clientes._id":1,
"clientes.nome":1,
"clientes.tipoCliente":1,
"clientes.qtdPedidoComprado":1
}},
]);
} Bons Estudos!!!

Você também pode gostar