No artigo de hoje veremos como podemos trabalhar com os dados no banco MongoDB.
Como conhecemos um pouco sobre o modelo de dados do MongoDB em um artigo anterior, vamos avançar um pouco mais em como podemos trabalhar estes dados.
Bom vamos começar.
Vamos visualizar a lista de banco de dados disponíveis no MongoDB com o comando: show dbs, abaixo:
> show dbs admin 0.000GB local 0.000GB >
Se você quiser visualizar as coleções existentes use o comando: show collections, como abaixo:
> show collections system.users system.version >
01 - Criando banco de dados e collection:
Certo, agora vamos ver como setamos um banco de dados no MongoDB para trabalhar-mos com ele. Para isso usamos a função: use, como demonstrado abaixo.
Usando a função: use, seguida do nome do banco de dados, nós usamos um banco existente ou criamos um novo caso não exista.
O fato de chamar a função: use, já define a variável global db(database) para o nome do banco de dados e isso quer dizer que todo comando que você executar posteriormente será executado no banco que você setou.
Exemplo para setar ou criar um banco caso não exista:
> use library switched to db library >
Vamos agora criar nossa collection com a função: createCollection, passando o nome da collection. Para isso utilize como abaixo:
> db.createCollection("media_teste")
{ "ok" : 1 }
> show collections
media_teste
>
Se você precisar renomear sua collection, você pode usar o: renameCollection:
> db.media_teste.renameCollection("media")
{ "ok" : 1 }
> show collections
media
>
02 - Inserindo dados em coleções:
Certo, agora que temos nosso banco chamado: library e nossa collection por nome de: media, vamos ver com inserir dados dentro dela.
Vamos inserir um documento(dado) em nossa coleção com o comando: insert:
Definimos nossos dados:
> document_exemplo = (
... {
... "Type": "Book",
... "Title": "Aprenda MongoDB",
... "ISBN": "787-2-2354-8788-9",
... "Publisher": "Apress",
... "Author": [
... "David", "Brian",
... "Lucas", "Steve"
... ]
... })
{
"Type" : "Book",
"Title" : "Aprenda MongoDB",
"ISBN" : "787-2-2354-8788-9",
"Publisher" : "Apress",
"Author" : [
"David",
"Brian",
"Lucas",
"Steve"
]
}
>
e inserimos:
> db.media.insert(document_exemplo)
WriteResult({ "nInserted" : 1 })
>
A outra opção para inserir os dados diretamente, é usar a função insert sem definir o documento antes, como demonstrado abaixo:
> db.media.insert(
... {
... "Type": "CD",
... "Artist": "Nirvana",
... "Title": "Neverwind",
... "Genre": "Grunge",
... "Releasedate": "1991.09.24",
... "Tracklist": [
... {
... "Track" : "1",
... "Title" : "Smells Like Teen Spirit",
... "Length" : "5:02"
... },
... {
... "Track" : "2",
... "Title" : "In Bloon",
... "Length" : "4:15"
... }
... ]
... }
... )
WriteResult({ "nInserted" : 1 })
>
03 - Pesquisando dados em coleções:
Se você quiser consultar todos os documentos adicionados até agora utilize a função: find, como demonstrado abaixo:
> db.media.find()
{ "_id" : ObjectId("5a356538d8311cba58ac30ed"), "Type" : "Book", "Title" : "Aprenda MongoDB", "ISBN" : "787-2-2354-8788-9", "Publisher" : "Apress", "Author" : [ "David", "Brian", "Lucas", "Steve" ] }
{ "_id" : ObjectId("5a35659dd8311cba58ac30ee"), "Type" : "CD", "Artist" : "Nirvana", "Title" : "Neverwind", "Genre" : "Grunge", "Releasedate" : "1991.09.24", "Tracklist" : [ { "Track" : "1", "Title" : "Smells Like Teen Spirit", "Length" : "5:02" }, { "Track" : "2", "Title" : "In Bloon", "Length" : "4:15" } ] }
>
Agora se você quiser filtrar apenas alguma informação desejada ou específica, como, todos os livros com título: Aprenda MongoDB, você pode utilizar a função find como abaixo:
> db.media.find({Title : "Aprenda MongoDB"})
{ "_id" : ObjectId("5a356538d8311cba58ac30ed"), "Type" : "Book", "Title" : "Aprenda MongoDB", "ISBN" : "787-2-2354-8788-9", "Publisher" : "Apress", "Author" : [ "David", "Brian", "Lucas", "Steve" ] }
>
Assim como o limit no MySQL ou rownum no Oracle, podemos utilizar o limit() no MongoDB para especificar o número máximo de resultados reornados, veja:
> db.media.find().limit(1)
{ "_id" : ObjectId("5a356538d8311cba58ac30ed"), "Type" : "Book", "Title" : "Aprenda MongoDB", "ISBN" : "787-2-2354-8788-9", "Publisher" : "Apress", "Author" : [ "David", "Brian", "Lucas", "Steve" ] }
>
Agora se o que você quer é ignorar os primeiros n documentos de uma coleção, podemos utilizar o skip como abaixo:
> db.media.find().skip(1)
{ "_id" : ObjectId("5a35659dd8311cba58ac30ee"), "Type" : "CD", "Artist" : "Nirvana", "Title" : "Neverwind", "Genre" : "Grunge", "Releasedate" : "1991.09.24", "Tracklist" : [ { "Track" : "1", "Title" : "Smells Like Teen Spirit", "Length" : "5:02" }, { "Track" : "2", "Title" : "In Bloon", "Length" : "4:15" } ] }
>
Podemos combinar funções no MongoDB. Por Exemplo, podemos ordenar pelo titulo, limitando a um resultado de dois documentos, ignorando o primeiro que estiver na collection:
> db.media.find().sort({title : -1}).limit(2).skip(1)
{ "_id" : ObjectId("5a35659dd8311cba58ac30ee"), "Type" : "CD", "Artist" : "Nirvana", "Title" : "Neverwind", "Genre" : "Grunge", "Releasedate" : "1991.09.24", "Tracklist" : [ { "Track" : "1", "Title" : "Smells Like Teen Spirit", "Length" : "5:02" }, { "Track" : "2", "Title" : "In Bloon", "Length" : "4:15" } ] }
>
04 - Agregações - count, distinct:
Para retornar-mos a quantidade de documentos na coleção:
> db.media.count() 2
A quantidade de algum filtro específico:
> db.media.find({Title : "Aprenda MongoDB"}).count()
1
Vamos ver o uso do distinct agora.
Vamos inserir o documento livro novamente, ficando duplicado em nossa coleção:
> db.media.insert(
... {
... "Type": "Book",
... "Title": "Aprenda MongoDB",
... "ISBN": "987-4302-3051-9",
... "Publisher": "Apress",
... "Author": [
... "David", "Brian",
... "Lucas", "Steve"
... ]
... })
WriteResult({ "nInserted" : 1 })
>
Certo, neste ponto temos dois livros com o títulos idênticos. Se quisermos obter apenas os títulos com nome distintos, usamos abaixo:
Compare também o segundo distinct por: ISBN, veja que como são diferente são retornados todas as ocorrências.
> db.media.distinct("Title")
[ "Aprenda MongoDB", "Neverwind" ]
>
> db.media.distinct("ISBN")
[ "787-2-2354-8788-9", "987-4302-3051-9" ]
>
05 - Menor e/ou Maior que:
Vamos inserir três documentos do tipo DVD para nosso teste:
> db.media.insert(
... {
... "Type": "DVD",
... "Title": "Toy Story3",
... "Released": 2010
... })
WriteResult({ "nInserted" : 1 })
> db.media.insert(
... {
... "Type": "DVD",
... "Title": "Matrix",
... "Released": 1999
... })
WriteResult({ "nInserted" : 1 })
> db.media.insert(
... {
... "Type": "DVD",
... "Title": "Blade Runner",
... "Released": 1982
... })
WriteResult({ "nInserted" : 1 })
Vamos iniciar nosso exemplo utilizando o parâmetro $gt (greater than, maior que), onde filtraremos os DVDs com Released maior que 2000:
> db.media.find({Released : {$gt : 2000}}, {"Cast" : 0})
{ "_id" : ObjectId("5a35678cd8311cba58ac30f0"), "Type" : "DVD", "Title" : "Toy Story3", "Released" : 2010 }
>
Para filtrarmos maior ou igual utilize o parâmetro $gte:
> db.media.find({Released : {$gte : 1999}}, {"Cast" : 0})
{ "_id" : ObjectId("5a35678cd8311cba58ac30f0"), "Type" : "DVD", "Title" : "Toy Story3", "Released" : 2010 }
{ "_id" : ObjectId("5a3567a2d8311cba58ac30f1"), "Type" : "DVD", "Title" : "Matrix", "Released" : 1999 }
>
De modo semelhante, podemos usar o parâmetro $lt(less than, menor que) para encontrar documentos que o ano seja anterior a 1999:
> db.media.find({Released : {$lt : 1999}}, {"Cast" : 0})
{ "_id" : ObjectId("5a3567b6d8311cba58ac30f2"), "Type" : "DVD", "Title" : "Blade Runner", "Released" : 1982 }
>
Para filtrarmos menor ou igual utilize o parâmetro $lte:
> db.media.find({Released : {$lte : 1999}}, {"Cast" : 0})
{ "_id" : ObjectId("5a3567a2d8311cba58ac30f1"), "Type" : "DVD", "Title" : "Matrix", "Released" : 1999 }
{ "_id" : ObjectId("5a3567b6d8311cba58ac30f2"), "Type" : "DVD", "Title" : "Blade Runner", "Released" : 1982 }
>
Para especificar um intervalo use:
> db.media.find({Released : {$gte: 1990, $lt : 2010}}, {"Cast" : 0})
{ "_id" : ObjectId("5a3567a2d8311cba58ac30f1"), "Type" : "DVD", "Title" : "Matrix", "Released" : 1999 }
>
06 - Atualizando dados:
Para atualizar dados no MongoDB vamos utilizar a função: update(), passando três argumentos:
1 - Os dados a serem atualizados
2 - A informação atualizada
3 - Opção para atualizar um documento que pode ser: upsert e multi.
A opção upsert diz ao MongoDB para atualizar o registro se ele existir e criá-lo caso não exista.
Já a opção multi, diz se todos os documentos correspondentes devem ser atualizados ou somente o primeiro(ação default).
> db.media.update(
... {"Title": "Matrix"},
... {"Title": "Matrix Atualizado"},
... {upsert: true}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
Se houver vários documentos que atendam os critérios e você deseja efetuar o upsert em todos eles, você pode utilizar como abaixo:
db.media.update(
{"Title": "Matrix"},
{"Title": "Matrix Atualizado"},
{upsert: true, multi: true}
)
Se quiser incrementar os anos da DVD Matrix, voce pode usar o update abaixo, usando o $inc:
> db.media.update({"Title": "Matrix Atualizado"}, {$inc: {"Released" : 4}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.media.find({"Title": "Matrix Atualizado"})
{ "_id" : ObjectId("5a3567a2d8311cba58ac30f1"), "Title" : "Matrix Atualizado", "Released" : 4 }
>
Podemos usar o operador: $set para definir um campo com um valor que você quiser especificar, como abaixo, setamos o ano para 2020:
> db.media.update({"Title": "Matrix Atualizado"}, {$set: {Released : 2020}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.media.find({"Title": "Matrix Atualizado"})
{ "_id" : ObjectId("5a3567a2d8311cba58ac30f1"), "Title" : "Matrix Atualizado", "Released" : 2020 }
>
Agora se você quiser apagar o valor de um campo, pode-se utilizar o: $unset, veja:
> db.media.update({"Title": "Matrix Atualizado"}, {$unset: {"Released" : 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.media.find({"Title": "Matrix Atualizado"})
{ "_id" : ObjectId("5a3567a2d8311cba58ac30f1"), "Title" : "Matrix Atualizado" }
>
07 - Removendo documentos, collection ou banco de dados:
Para remover um ou todos os documentos com o título: Matrix Atualizado, utilizamos a função: remove():
> db.media.remove({"Title": "Matrix Atualizado"})
WriteResult({ "nRemoved" : 1 })
Para remover todos os documentos da collection:
> db.media.remove({})
WriteResult({ "nRemoved" : 5 })
>
Para dropar uma collection inteira use:
> db.media.drop() true >
Para eliminar todo o banco de dados utilize: dropDatabase, veja um exemplo:
> db.dropDatabase()
{ "dropped" : "library", "ok" : 1 }
>
08 - Indices:
Vamos criar um indice pela chave: Title. Para isso utilizamos a função: ensureIndex, como abaixo:
O :1 específica a direção do indice, 1 em ordem crescente, -1 decrescente.
> db.media.ensureIndex({Title : 1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Ou para criar o indice em segundo plano com a opção: background:
> db.media.ensureIndex({ISBN : 1}, {background: true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
Bom é isso ai pessoal, ai ficam algumas dicas.
Abraço,
Ronaldo.
Nenhum comentário:
Postar um comentário