é um banco NOSQL orientado a documento, criado em 2007 pela
10Gen (antiga double click que foi comprada pelo Google pra
fazer a parte de analytics) hoje em dia chamada de MONGO INC
Foi escrito em C++ e sua interface é em JavaScript,
isso mesmo, você irá programar em JavaScript no
seu banco de dados.
Principais características: NoSql e SchemaLess
Mais rápido pois não tem JOINS, transações ou constraints (mas
suporta indíces). Não é um banco relacional mas permite um
carregamento fetch (operador $lookup de aggregations –
Mongo 3.2 em diante)
Configura facilmente uma réplica set. Possui métodos para eleger
novo nó master caso o atual se perca.
Nós masters não aceitam escrita direta. Estas são feitas nos
slaves que sincronizam com a master
Utiliza, por default, Ids do tipo ObjectId. Este valor é um
hexadecimal computado da seguinte forma:
Um valor de 4 bytes representando segundos (timestamp)
Um valor de 3 bytes com identificador da máquina
Um valor de 2 bytes com id do processo e um contador 3 bytes,
começando com um valor Random
ObjectId("507f1f77bcf86cd799439011")
OBS: Dá pra saber a hora da criação de um documento a partir do ID
NOSQL
Not Only SQL - Não Somente SQL) é um termo genérico para uma
classe definida de banco de dados não-relacionais que rompe
uma longa história de banco de dados relacionais com
propriedades ACID
Cada documento pode divergir de outro completamente. Não
amarrado ou restrito a um esquema. Vide um exemplo da coleção
a seguir...
SCHEMA LESS
Um exemplo de um documento de aeronaves, com propriedades e
atributos pertinentes. Um documento de uma coleção de aircrafts
poderia ser escrito desta forma:
{
"aircraftData" : {
"age" : "2.0",
"tailNumber" : "N347QS",
"project" : "505",
"serialNumber" : "00257",
"model" : "Phenom 300"
},
"ownerCode" : "520651",
"operatorCode" : "525736"
}
Após ser persistido no Mongo.....
{
"_id" : ObjectId("57555a8875b989efca22799c"),
"aircraftData" : {
"age" : "2.0",
"tailNumber" : "N347QS",
"project" : "505",
"serialNumber" : "00257",
"model" : "Phenom 300"
},
"ownerCode" : "520651",
"operatorCode" : "525736",
"__v" : 0
}
* A chave __v (versão) é a propriedade setada em cada documento quanto sofre sua primeira criação
pelo Mongoose. Esta chave contem os valores das revisões internas de cada documento. O nome
desta propriedade dentro do documento é configurável. Por default seu nome é __v.
{
"_id" : ObjectId("57555a8875b989efca22799c"),
"bolinhas" : {
“quantidade”: 8,
“cor”: “vermelho”
},
“__v”: 0
}
Deploy / Rollback: Sem preocupações com banco.
Viva Schemaless
Inserindo um segundo documento na coleção de Aircrafts???
COMANDOS
(PRINCIPAIS OPERAÇÕES)
CREATE
db.people.save({'kadu': '1984'})
db.getCollection('people').save({
'name': 'Carlos E F Correa',
'address': 'Rua Abilia Machado',
'telephones': [
{number: '1299135-9134', 'type': 'mobile'},
{number: '3921-1111', 'type': 'comercial'}
],
'nickName': 'Kadu'
})
> use papoReto
switched to db papoReto
Inserindo dois documentos na coleção people (dentro do banco papoReto) de
maneiras distintas:
INSERT MANY
db.people.insertMany([
{
'kadu': '1984'
},
{
'name': 'Carlos E F Correa',
'address': 'Rua Abilia Machado',
'telephones': [
{number: '1299135-9134', 'type': 'mobile'},
{number: '3921-1111', 'type': 'comercial'}
],
'nickName': 'Kadu'
}
])
FIND
{ "_id" : ObjectId("595bc672e55926c327558acd"), "kadu" : "1984" }
{“_id" : ObjectId("595bc74ee55926c327558ace"),
name" : "Carlos E F Correa",
"address" : "Rua Abilia Machado",
"telephones" : [
{
"number" : "1299135-9134",
"type" : "mobile"
},
{
"number" : "3921-1111",
"type" : "comercial"
}
],
"nickName" : "Kadu"}
> db.people.find({'kadu':'1984'})
{ "_id" : ObjectId("595bc672e55926c327558acd"), "kadu" : "1984" }
> db.people.find().pretty()
Obtendo todos os documentos da coleção people, (pretty):
FIND ONE
> db.people.findOne({nickName: 'Kadu', address: 'Rua Abilia Machado'})
{“_id" : ObjectId("595bc74ee55926c327558ace"),
name" : "Carlos E F Correa",
"address" : "Rua Abilia Machado",
"telephones" : [
{
"number" : "1299135-9134",
"type" : "mobile"
},
{
"number" : "3921-1111",
"type" : "comercial"
}
],
"nickName" : "Kadu"
}
> db.people.findOne()
{ "_id" : ObjectId("595bc672e55926c327558acd"), "kadu" : "1984" }
Obtendo o primeiro documento que case com a query
FIND COM SORT, LIMIT E SKIP = PAGINAÇÃO
Exemplo de find paginando resultados
db.people.find({ 'address': 'Rua Abilia Machado, numero 53''}, {name: 1, _id: 1})
.sort({address: 1, name: -1})
.skip(100)
.limit(100)
Me traga todos documentos da coleção de pessoa que tenham o endereço em
questão, retornando apenas os campos name e _id, ordenando por endereço
crescente por nome decrescente, me trazendo a segunda página da pesquisa e
limitando o retorno a 100 resultados.
Explicação.
VAMOS FALAR DE UPDATE
{
"_id" : ObjectId("595bc74ee55926c327558ace"),
"name" : "Carlos E F Correa",
"address" : "Rua Abilia Machado",
"telephones" : [
{
"number" : "1299135-9134",
"type" : "mobile"
},
{
"number" : "3921-1111",
"type" : "comercial"
}
],
"nickName" : "Kadu"
}
Voltando a nossa coleção de pessoas, temos:
TROCANDO O NOME
{
"_id" : ObjectId("595bc672e55926c327558ace"),
"name" : "Carlos Eduardo Ferreiro Correa"
}
db.people.update({_id: ObjectId("595bc672e55926c327558ace")}, {name: 'Carlos Eduardo Ferreiro Correa'})
RESULTADO
O QUE HOUVE?
Simplesmente o esperado, solicitei ao mongoDB editar a pessoa de minha coleção de
ObjectId(''595bc672e55926c327558ace”), setando o seu conteúdo para um JSON
contendo apenas o atributo e valor do campo name
OPERADOR $set
db.people.update(
{_id: ObjectId("595bc672e55926c327558ace")},
{$set: {'name': 'Carlos Eduardo Ferreiro Correa', 'address': 'Rua Abilia Machado, numero 53'}}
)
(OBS: Antes da execução da query acima, voltei o document ao que era.)
{
"_id" : ObjectId("595bc74ee55926c327558ace"),
"name" : "Carlos Eduardo Ferreiro Correa",
"address" : "Rua Abilia Machado, numero 53",
"telephones" : [
{
"number" : "1299135-9134",
"type" : "mobile"
},
{
"number" : "3921-1111",
"type" : "comercial"
}
],
"nickName" : "Kadu"
}
OPERADOR $unset
db.people.update(
{_id: ObjectId("595bc672e55926c327558ace")},
{$unset: {'name': 1}}
)
{
"_id" : ObjectId("595bc74ee55926c327558ace"),
"address" : "Rua Abilia Machado, numero 53",
"telephones" : [
{
"number" : "1299135-9134",
"type" : "mobile"
},
{
"number" : "3921-1111",
"type" : "comercial"
}
],
"nickName" : "Kadu"
}
OPERATORS INTERESSANTES
$sum,
$addToSet (array),
$currentDate,
$set,
$setOnInsert,
$lt,
$lte,
$gt
$gte,
$in
Mais detalhes em https://docs.mongodb.com/manual/
$unset
$exists,
$type,
$nin,
$or,
$and,
$not,
$nor,
$mod,
$size (array)
$regex
FIND ONE AND UPDATE + OPERATORS = ATOMICIDADE
Como já dito, MongoDB não tem transação. Isso significa que nunca podemos fazer:
var people = db.people.findOne({_id: ObjectId("595bc672e55926c327558ace")})
Para depois fazer:
db.people.update({_id: people._id}, {$set: {name: 'Carlos Eduardo'}})
Uma vez que não temos transações, certamente iremos duplicar (ou estragar) os
documentos se estivermos o recebendo de algum lugar. Como fazer?
Tudo NUMA TACADA SÓ... SEMPRE.
db.people.findOneAndUpdate({_id: ObjectId("595bc672e55926c327558ace")},
{$set: {name: 'Carlos Eduardo'}})
Todas escritas no MongoDB são atômicas no nível de um único documento
ALGUNS MODIFIERS
Modifiers (modificadores) são passados as queries como seu terceiro
parâmetro JSON.
Estes “comandos” são capazes de modificar o comportamento de uma
query, como por exemplo:
criar um documento em um update caso ainda não exista sua ocorrência.
limitar o números de documentos afetados por uma query
retornar no find o atual estado do documento após sofrer um update.
Mais segurança nos UPDATES e DELETES usando
modifiers (multi e justOne)
UPDATE/DELETE
===
PESADELO
db.getCollection('aircrafts').remove({'aircraftData.model': 'Phenom 300'},
{justOne: true}
Exclui apenas o primeiro documento que casa com a condição
db.getCollection('aircrafts').remove({'aircraftData.model': 'Phenom 300'},
{justOne: true})
{justOne: false} / inexistente
Exclui todos documents casam com a condição
justOne
{multi: true}
Atualiza TODOS documentos que forem encontrado na coleção
para aquela condição
db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Phenom 300'},
{$set: {'aircraftData.model': 'phenom 300'}})
{multi: false} / inexistente
Atualiza apenas o primeiro documento que for encontrado na
coleção com a condição
multi
db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Phenom 300'},
{$set: {'aircraftData.model': 'phenom 300'}}, {multi: true})
{upsert: true}
Procura pela condição um documento e o atualiza. Caso não
encontre nenhum documento na condição especificada, cria com o
filtro da pesquisa ({aircraftData.model': 'Lineage'})
db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'},
{$set: {'aircraftData.model': 'phenom 300'}})
{upsert: false} / inexistente
Procura pela condição um documento e o atualiza. Caso não
encontre nenhum documento na condição especificada, não faz
nada.
upsert
db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'}, {$set:
{'aircraftData.model': 'phenom 300'}}, {upsert: true})
{new: true}
Retorna no findOneAndUpdate o estado atual do documento no
MongoDB após ter sofrido o update informado na query; Neste caso
retornará o objeto aircraft do banco com partNumber setado
db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'},
{$set: {'partNumber: '12345'}})
{new: false} / inexistente
Retorna no findOneAndUpdate o estado atual do documento no
MongoDB, ou seja, antes de sofrer o $set (update)
new
db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'},
{$set: {partNumber: '3366399'}}, {new: true})
PARA UMA PRÓXIMA...
INDÍCES E COMANDO explain()
Índices são muito importantes para qualquer pesquisa em todos bancos de dados, no
MongoDB não é diferente. Agiliza mais a consulta com o preço de um impacto no insert.
MongoDB possui uniqueIndex e indices para pesquisas em um ou mais campos da
coleção.
Existe um comando explain() que pode ser usado no fim cada instrução find. Esta
operação revela dados de como o mongo está efetuando a pesquisa, qual caminho e
estratégia ele escolheu para executar o find, se está usando o índice criado ou nao (se
é uma query covered ou não), tempo de execução, por quantos documentos o mongo
teve de passar para achar o seu indíce, etc
PARA UMA PRÓXIMA...
AGGREGATIONS
Aggregations (aggregações), são queries mais complexas que nos permitem
uma série de transformações nos dados assim como nos bancos SQL –
group, count, unwind, etc
É um “concorrente” (alternativa) do MapReduce.
A própria MongoDB diz use Aggregations, não use MapReduce, pois são
feitos exclusivamente para transformações – Performáticos e mais intuitivos
de se implementar
PARA UMA PRÓXIMA...
QUERIES GEOESPACIAIS
É possível armazenar coordenadas geoespaciais como um objeto GeoJSON
ou como pares de coordenadas legadas x (latitude) e y (longitude).
MongoDB é capaz de executar queries especifícas para analisar se uma dada
coordenada está perto de outra, ou se há intersecção de áreas específicas
através de operadores especiais
mongoDB University
Site que prover cursos gratuitos para MongoDB e seus respectivos libs em
diversas linguages (Node, Java, C#).
Existem cursos avançados lá, como por exemplo o de Mongo DBA.
https://university.mongodb.com/
Eng. CARLOS EDUARDO FERREIRO CORREA
kadusjc@yahoo.com.br (Sim... Uso Yahoo)
OBRIGADO

Introdução ao MongoDB

  • 2.
    é um bancoNOSQL orientado a documento, criado em 2007 pela 10Gen (antiga double click que foi comprada pelo Google pra fazer a parte de analytics) hoje em dia chamada de MONGO INC Foi escrito em C++ e sua interface é em JavaScript, isso mesmo, você irá programar em JavaScript no seu banco de dados. Principais características: NoSql e SchemaLess
  • 3.
    Mais rápido poisnão tem JOINS, transações ou constraints (mas suporta indíces). Não é um banco relacional mas permite um carregamento fetch (operador $lookup de aggregations – Mongo 3.2 em diante) Configura facilmente uma réplica set. Possui métodos para eleger novo nó master caso o atual se perca. Nós masters não aceitam escrita direta. Estas são feitas nos slaves que sincronizam com a master Utiliza, por default, Ids do tipo ObjectId. Este valor é um hexadecimal computado da seguinte forma: Um valor de 4 bytes representando segundos (timestamp) Um valor de 3 bytes com identificador da máquina Um valor de 2 bytes com id do processo e um contador 3 bytes, começando com um valor Random ObjectId("507f1f77bcf86cd799439011") OBS: Dá pra saber a hora da criação de um documento a partir do ID
  • 4.
    NOSQL Not Only SQL- Não Somente SQL) é um termo genérico para uma classe definida de banco de dados não-relacionais que rompe uma longa história de banco de dados relacionais com propriedades ACID Cada documento pode divergir de outro completamente. Não amarrado ou restrito a um esquema. Vide um exemplo da coleção a seguir... SCHEMA LESS
  • 5.
    Um exemplo deum documento de aeronaves, com propriedades e atributos pertinentes. Um documento de uma coleção de aircrafts poderia ser escrito desta forma: { "aircraftData" : { "age" : "2.0", "tailNumber" : "N347QS", "project" : "505", "serialNumber" : "00257", "model" : "Phenom 300" }, "ownerCode" : "520651", "operatorCode" : "525736" } Após ser persistido no Mongo.....
  • 6.
    { "_id" : ObjectId("57555a8875b989efca22799c"), "aircraftData": { "age" : "2.0", "tailNumber" : "N347QS", "project" : "505", "serialNumber" : "00257", "model" : "Phenom 300" }, "ownerCode" : "520651", "operatorCode" : "525736", "__v" : 0 } * A chave __v (versão) é a propriedade setada em cada documento quanto sofre sua primeira criação pelo Mongoose. Esta chave contem os valores das revisões internas de cada documento. O nome desta propriedade dentro do documento é configurável. Por default seu nome é __v.
  • 7.
    { "_id" : ObjectId("57555a8875b989efca22799c"), "bolinhas": { “quantidade”: 8, “cor”: “vermelho” }, “__v”: 0 } Deploy / Rollback: Sem preocupações com banco. Viva Schemaless Inserindo um segundo documento na coleção de Aircrafts???
  • 8.
  • 9.
    CREATE db.people.save({'kadu': '1984'}) db.getCollection('people').save({ 'name': 'CarlosE F Correa', 'address': 'Rua Abilia Machado', 'telephones': [ {number: '1299135-9134', 'type': 'mobile'}, {number: '3921-1111', 'type': 'comercial'} ], 'nickName': 'Kadu' }) > use papoReto switched to db papoReto Inserindo dois documentos na coleção people (dentro do banco papoReto) de maneiras distintas:
  • 10.
    INSERT MANY db.people.insertMany([ { 'kadu': '1984' }, { 'name':'Carlos E F Correa', 'address': 'Rua Abilia Machado', 'telephones': [ {number: '1299135-9134', 'type': 'mobile'}, {number: '3921-1111', 'type': 'comercial'} ], 'nickName': 'Kadu' } ])
  • 11.
    FIND { "_id" :ObjectId("595bc672e55926c327558acd"), "kadu" : "1984" } {“_id" : ObjectId("595bc74ee55926c327558ace"), name" : "Carlos E F Correa", "address" : "Rua Abilia Machado", "telephones" : [ { "number" : "1299135-9134", "type" : "mobile" }, { "number" : "3921-1111", "type" : "comercial" } ], "nickName" : "Kadu"} > db.people.find({'kadu':'1984'}) { "_id" : ObjectId("595bc672e55926c327558acd"), "kadu" : "1984" } > db.people.find().pretty() Obtendo todos os documentos da coleção people, (pretty):
  • 12.
    FIND ONE > db.people.findOne({nickName:'Kadu', address: 'Rua Abilia Machado'}) {“_id" : ObjectId("595bc74ee55926c327558ace"), name" : "Carlos E F Correa", "address" : "Rua Abilia Machado", "telephones" : [ { "number" : "1299135-9134", "type" : "mobile" }, { "number" : "3921-1111", "type" : "comercial" } ], "nickName" : "Kadu" } > db.people.findOne() { "_id" : ObjectId("595bc672e55926c327558acd"), "kadu" : "1984" } Obtendo o primeiro documento que case com a query
  • 13.
    FIND COM SORT,LIMIT E SKIP = PAGINAÇÃO Exemplo de find paginando resultados db.people.find({ 'address': 'Rua Abilia Machado, numero 53''}, {name: 1, _id: 1}) .sort({address: 1, name: -1}) .skip(100) .limit(100) Me traga todos documentos da coleção de pessoa que tenham o endereço em questão, retornando apenas os campos name e _id, ordenando por endereço crescente por nome decrescente, me trazendo a segunda página da pesquisa e limitando o retorno a 100 resultados. Explicação.
  • 14.
    VAMOS FALAR DEUPDATE { "_id" : ObjectId("595bc74ee55926c327558ace"), "name" : "Carlos E F Correa", "address" : "Rua Abilia Machado", "telephones" : [ { "number" : "1299135-9134", "type" : "mobile" }, { "number" : "3921-1111", "type" : "comercial" } ], "nickName" : "Kadu" } Voltando a nossa coleção de pessoas, temos:
  • 15.
    TROCANDO O NOME { "_id": ObjectId("595bc672e55926c327558ace"), "name" : "Carlos Eduardo Ferreiro Correa" } db.people.update({_id: ObjectId("595bc672e55926c327558ace")}, {name: 'Carlos Eduardo Ferreiro Correa'}) RESULTADO O QUE HOUVE? Simplesmente o esperado, solicitei ao mongoDB editar a pessoa de minha coleção de ObjectId(''595bc672e55926c327558ace”), setando o seu conteúdo para um JSON contendo apenas o atributo e valor do campo name
  • 16.
    OPERADOR $set db.people.update( {_id: ObjectId("595bc672e55926c327558ace")}, {$set:{'name': 'Carlos Eduardo Ferreiro Correa', 'address': 'Rua Abilia Machado, numero 53'}} ) (OBS: Antes da execução da query acima, voltei o document ao que era.) { "_id" : ObjectId("595bc74ee55926c327558ace"), "name" : "Carlos Eduardo Ferreiro Correa", "address" : "Rua Abilia Machado, numero 53", "telephones" : [ { "number" : "1299135-9134", "type" : "mobile" }, { "number" : "3921-1111", "type" : "comercial" } ], "nickName" : "Kadu" }
  • 17.
    OPERADOR $unset db.people.update( {_id: ObjectId("595bc672e55926c327558ace")}, {$unset:{'name': 1}} ) { "_id" : ObjectId("595bc74ee55926c327558ace"), "address" : "Rua Abilia Machado, numero 53", "telephones" : [ { "number" : "1299135-9134", "type" : "mobile" }, { "number" : "3921-1111", "type" : "comercial" } ], "nickName" : "Kadu" }
  • 18.
    OPERATORS INTERESSANTES $sum, $addToSet (array), $currentDate, $set, $setOnInsert, $lt, $lte, $gt $gte, $in Maisdetalhes em https://docs.mongodb.com/manual/ $unset $exists, $type, $nin, $or, $and, $not, $nor, $mod, $size (array) $regex
  • 19.
    FIND ONE ANDUPDATE + OPERATORS = ATOMICIDADE Como já dito, MongoDB não tem transação. Isso significa que nunca podemos fazer: var people = db.people.findOne({_id: ObjectId("595bc672e55926c327558ace")}) Para depois fazer: db.people.update({_id: people._id}, {$set: {name: 'Carlos Eduardo'}}) Uma vez que não temos transações, certamente iremos duplicar (ou estragar) os documentos se estivermos o recebendo de algum lugar. Como fazer? Tudo NUMA TACADA SÓ... SEMPRE. db.people.findOneAndUpdate({_id: ObjectId("595bc672e55926c327558ace")}, {$set: {name: 'Carlos Eduardo'}}) Todas escritas no MongoDB são atômicas no nível de um único documento
  • 20.
    ALGUNS MODIFIERS Modifiers (modificadores)são passados as queries como seu terceiro parâmetro JSON. Estes “comandos” são capazes de modificar o comportamento de uma query, como por exemplo: criar um documento em um update caso ainda não exista sua ocorrência. limitar o números de documentos afetados por uma query retornar no find o atual estado do documento após sofrer um update.
  • 21.
    Mais segurança nosUPDATES e DELETES usando modifiers (multi e justOne) UPDATE/DELETE === PESADELO
  • 22.
    db.getCollection('aircrafts').remove({'aircraftData.model': 'Phenom 300'}, {justOne:true} Exclui apenas o primeiro documento que casa com a condição db.getCollection('aircrafts').remove({'aircraftData.model': 'Phenom 300'}, {justOne: true}) {justOne: false} / inexistente Exclui todos documents casam com a condição justOne
  • 23.
    {multi: true} Atualiza TODOSdocumentos que forem encontrado na coleção para aquela condição db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Phenom 300'}, {$set: {'aircraftData.model': 'phenom 300'}}) {multi: false} / inexistente Atualiza apenas o primeiro documento que for encontrado na coleção com a condição multi db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Phenom 300'}, {$set: {'aircraftData.model': 'phenom 300'}}, {multi: true})
  • 24.
    {upsert: true} Procura pelacondição um documento e o atualiza. Caso não encontre nenhum documento na condição especificada, cria com o filtro da pesquisa ({aircraftData.model': 'Lineage'}) db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'}, {$set: {'aircraftData.model': 'phenom 300'}}) {upsert: false} / inexistente Procura pela condição um documento e o atualiza. Caso não encontre nenhum documento na condição especificada, não faz nada. upsert db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'}, {$set: {'aircraftData.model': 'phenom 300'}}, {upsert: true})
  • 25.
    {new: true} Retorna nofindOneAndUpdate o estado atual do documento no MongoDB após ter sofrido o update informado na query; Neste caso retornará o objeto aircraft do banco com partNumber setado db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'}, {$set: {'partNumber: '12345'}}) {new: false} / inexistente Retorna no findOneAndUpdate o estado atual do documento no MongoDB, ou seja, antes de sofrer o $set (update) new db.aircrafts.findOneAndUpdate({'aircraftData.model': 'Lineage'}, {$set: {partNumber: '3366399'}}, {new: true})
  • 26.
    PARA UMA PRÓXIMA... INDÍCESE COMANDO explain() Índices são muito importantes para qualquer pesquisa em todos bancos de dados, no MongoDB não é diferente. Agiliza mais a consulta com o preço de um impacto no insert. MongoDB possui uniqueIndex e indices para pesquisas em um ou mais campos da coleção. Existe um comando explain() que pode ser usado no fim cada instrução find. Esta operação revela dados de como o mongo está efetuando a pesquisa, qual caminho e estratégia ele escolheu para executar o find, se está usando o índice criado ou nao (se é uma query covered ou não), tempo de execução, por quantos documentos o mongo teve de passar para achar o seu indíce, etc
  • 27.
    PARA UMA PRÓXIMA... AGGREGATIONS Aggregations(aggregações), são queries mais complexas que nos permitem uma série de transformações nos dados assim como nos bancos SQL – group, count, unwind, etc É um “concorrente” (alternativa) do MapReduce. A própria MongoDB diz use Aggregations, não use MapReduce, pois são feitos exclusivamente para transformações – Performáticos e mais intuitivos de se implementar
  • 28.
    PARA UMA PRÓXIMA... QUERIESGEOESPACIAIS É possível armazenar coordenadas geoespaciais como um objeto GeoJSON ou como pares de coordenadas legadas x (latitude) e y (longitude). MongoDB é capaz de executar queries especifícas para analisar se uma dada coordenada está perto de outra, ou se há intersecção de áreas específicas através de operadores especiais
  • 29.
    mongoDB University Site queprover cursos gratuitos para MongoDB e seus respectivos libs em diversas linguages (Node, Java, C#). Existem cursos avançados lá, como por exemplo o de Mongo DBA. https://university.mongodb.com/
  • 31.
    Eng. CARLOS EDUARDOFERREIRO CORREA kadusjc@yahoo.com.br (Sim... Uso Yahoo) OBRIGADO