Neste artigo, abordaremos como realizar operações básicas de consulta no MongoDB. Estamos produzindo dados em um ritmo incomparável agora seguindo a disseminação global da internet. Uma vez que nos exigirá a coleta/solicitação dos dados necessários do banco de dados para realizar algum tipo de análise, é de extrema importância que escolhamos a ferramenta certa para consultar os dados.
É aqui que entra o MongoDB, especificamente. MongoDB é um banco de dados não estruturado que, na forma de documentos, armazena dados. Além disso, o MongoDB é muito eficaz no manuseio de enormes quantidades de dados e é o banco de dados NoSQL mais usado, pois fornece uma linguagem de consulta rica e acesso a dados versátil e fácil.
Criar um banco de dados de amostra
Antes de começar, criaremos um banco de dados de exemplo com alguns dados de exemplo para realizar todas as operações.
Vamos criar um banco de dados com o nome myDB e criará uma coleção com o nome pedidos . Para isso, a declaração seria a seguinte.
> use myDB
> db.createCollection("orders")
>
MongoDB não usa as linhas e colunas. Ele armazena os dados em um formato de documento. Uma coleção é um grupo de documentos.
Você pode verificar todas as coleções em um banco de dados usando a instrução a seguir.
> use myDB
>show collections
orders
system.indexes
>
Vamos inserir alguns documentos usando a seguinte instrução.
> db.orders.insert([
{
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 1000.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"},
PaymentMode":"Cash",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
Customer: "ron",
Address:{"City":"New York","Country":"USA"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
])
Um documento é o equivalente a uma linha RDBMS. Ele não precisa ter o mesmo esquema em cada documento. Isso significa que um documento pode não ter nenhum campo que não tenha nenhum valor.
Documentos de consulta
método find()
Você precisa usar o método find() para consultar documentos das coleções do MongoDB. A instrução a seguir recuperará todos os documentos da coleção.
> db.orders.find()
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 1000.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"},
PaymentMode":"Cash",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
Address:{"City":"New York","Country":"USA"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 600.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
>
Projeção
Se você quiser buscar apenas os campos selecionados, poderá usar a projeção. A instrução a seguir buscará apenas Cliente e E-mail campo.
> db.orders.find( { }, { Customer: 1, Email: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Email:"[email protected]"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
Email:"[email protected]"
}
>
Filtrar os documentos especificando uma condição
Agora vamos aprender como podemos buscar os documentos que correspondem a uma condição especificada. O MongoDB fornece muitos operadores de comparação para isso.
1. Operador $eq
O operador $eq verifica a igualdade do valor do campo com o valor especificado. Para buscar o pedido em que PaymentMode é 'Card' você pode usar a seguinte declaração
>db.orders.find( { PaymentMode: { $eq: "Card" } } )
Esta consulta também pode ser escrita como abaixo
>db.orders.find( { PaymentMode: "Card" } )
Uma instrução SQL semelhante seria a seguinte
SELECT * FROM orders WHERE PaymentMode="Card"
Exemplo
>db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
PaymentMode":"Card"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
PaymentMode":"Card"
}
>
Operador $eq com documento incorporado
Você deve ter notado que inserimos um documento incorporado Endereço nos Pedidos coleção. Se você quiser buscar o pedido onde País é 'Índia' você pode usar uma notação de ponto como a seguinte declaração.
>db.Orders.find( { "Address.Country": { $eq: "India" } } )
Esta consulta também pode ser escrita como abaixo
>db.Orders.find( { "Address.Country":"India" } )
Exemplo
>db.Orders.find( { "Address.Country": { $eq: "India" } } , { Customer: 1, Address: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"}
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"}
}
>
Operador $eq com array
O operador $eq recuperará todos os documentos se a condição especificada for verdadeira para qualquer item em uma matriz. Temos um OrderItems matriz no documento. Se você deseja filtrar os documentos em que 'papel' também foi solicitado, a instrução seria a seguinte.
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )
Esta consulta também pode ser escrita como abaixo
>db.Orders.find( { "OrderItems.ItemName": "paper" } )
Exemplo
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
}
>
2. Operador $gt
Você pode usar o operador $gt para recuperar os documentos em que o valor de um campo é maior que o valor especificado. A instrução a seguir buscará os documentos em que OrderTotal é maior que 800.
>db.orders.find( { OrderTotal: { $gt: 800.00 } } )
Uma instrução SQL semelhante seria a seguinte
SELECT * FROM orders WHERE OrderTotal>800.00
Exemplo
>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
}
>
3. Operador $gte
Você pode usar o operador $gte para recuperar os documentos onde o valor de um campo é maior ou igual ao valor especificado. A instrução a seguir buscará os documentos em que OrderTotal é maior ou igual a 800.
>db.orders.find( { OrderTotal: { $gte: 800.00 } } )
Uma instrução SQL semelhante seria a seguinte
SELECT * FROM orders WHERE OrderTotal>=800.00
Exemplo
>db.Orders.find( { "OrderTotal": { $gte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderTotal: 800.00
}
>
4. Operador $lt
Você pode usar o operador $lt para recuperar os documentos em que o valor de um campo é menor que o valor especificado. A instrução a seguir buscará os documentos em que OrderTotal é inferior a 800.
>db.orders.find( { OrderTotal: { $lt: 800.00 } } )
Uma instrução SQL semelhante seria a seguinte
SELECT * FROM orders WHERE OrderTotal<800.00
Exemplo
>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
4. Operador $lte
Você pode usar o operador $lte para recuperar os documentos em que o valor de um campo é menor ou igual ao valor especificado. A instrução a seguir buscará os documentos em que OrderTotal é menor ou igual a 800.
>db.orders.find( { OrderTotal: { $lte: 800.00 } } )
Uma instrução SQL semelhante seria a seguinte
SELECT * FROM orders WHERE OrderTotal<=800.00
Exemplo
>db.Orders.find( { "OrderTotal": { $lte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderTotal: 800.00
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
5. $ne Operador
Você pode usar o operador $ne para recuperar os documentos onde o valor de um campo não é igual ao valor especificado.
>db.orders.find( { PaymentMode: { $ne: "Card" } } )
Uma instrução SQL semelhante seria a seguinte
SELECT * FROM orders WHERE PaymentMode != "Card"
Exemplo
>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
PaymentMode":"Cash"
}
>
6. $in Operador
Você pode usar o operador $in para recuperar os documentos em que o valor de um campo é igual a qualquer valor na matriz especificada.
>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )
Exemplo
>db.Orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
}
>
7. $nin Operador
Você pode usar o operador $nin para recuperar os documentos onde o valor de um campo não é igual a nenhum valor na matriz especificada. Ele também selecionará os documentos onde o campo não existe.
>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )
Exemplo
>db.Orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
>
Indexação
Sabemos que a indexação é muito importante se estivermos realizando as consultas em um grande banco de dados. Sem indexação, a execução de uma consulta pode ser cara. Podemos adicionar um índice ascendente simples em um único campo usando a seguinte instrução.
>db.Orders.createIndex({"Customer":1})
O MongoDB cria um índice exclusivo no campo '_id' por padrão. Um índice exclusivo impedirá a inserção de dois documentos com o mesmo valor para esse campo. Se você deseja criar um índice exclusivo, a instrução seria a seguinte.
db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )
Conclusão
Espero que você tenha aprendido algo novo hoje. Se você quiser aprender mais algumas coisas no MongoDB, aqui está um artigo interessante sobre o MongoDB Self-Hosted. Também convido você a experimentar coisas por conta própria e compartilhar sua experiência na seção de comentários. Além disso, se você enfrentar algum problema com qualquer uma das definições acima, sinta-se à vontade para me perguntar nos comentários abaixo.