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