Trabalhando com Dados no MongoDB

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