Escolar Documentos
Profissional Documentos
Cultura Documentos
MongoDBGenericName
mais de 60 páginas
de dicas e truques profissionais
Conteúdo
Sobre ................................................ ................................................ ................................................ ............................. 1
Seção 1.1: Execução de um arquivo JavaScript no MongoDB ....................................... ................................................ ... 2 Seção
1.2: Tornando a saída de find legível no shell Seção 1.3: ................................................ .......................................... 2
Termos complementares ................................................ ................................................ ......................... 3
Seção 1.4: Instalação ................................................ ................................................ ............................................. 3
Seção 1.5: Comandos básicos no shell mongo ................................................ ................................................ ........ 6
Seção 1.6: Olá, mundo ................................................ ................................................ ................................................ 6
Capítulo 2: Operação CRUD ....................................... ................................................ ......................................... 7
Seção 2.1: Criar ................................................ ................................................ ................................................ ... 7
Seção 2.2: Atualização ....................................... ................................................ ................................................ ..... 7 Seção 2.3:
Excluir ................................................ ................................................ ................................................ ... 8
Seção 2.4: Leia ................................................ ................................................ ................................................ ..... 8
Seção 2.5: Atualização de documentos incorporados ................................................ ................................................ ...... 9
Seção 2.6: Mais operadores de atualização ............................... ................................................ ................................ 10 Seção 2.7:
Parâmetro "multi" ao atualizar vários documentos ................................................ ..................... 10
Capítulo 3: Obtendo informações do banco de dados
................................................ ................................................ . 11
Seção 3.1: Listar todas as coleções no banco de dados ................................................ ................................................ ........... 11
Seção 3.2: Listar todos os bancos de dados ................................................ ................................................ ................................ 11
Seção 5.1: Operador $set para atualizar campo(s) especificado(s) no(s) documento(s) .............................. ................................ 18
Capítulo 6: Upserts e inserções ................................................ ................................................ ....................... 20
Seção 6.1: Inserir um documento
................................................ ................................................ ............................. 20
Capítulo 7: Coleções ................................................ ................................................ .......................................... 21
Seção 7.1: Criar uma coleção ................................................ ................................................ ............................. 21
Seção 7.2: Coleta suspensa ................................................ ................................................ ......................................... 22
Capítulo 8: Agregação ....................................... ................................................ ......................................... 23
Seção 8.1: Contagem ................................................ ................................................ ................................................ .. 23
Seção 8.2: Soma ................................................ ................................................ ................................................ .... 23
Seção 8.3: Média .............................................. ................................................ ................................................ 24 Seção 8.4:
Operações com arrays ....................................... ................................................ ............................. 25 Seção 8.5: Agregar exemplos
de consulta úteis para trabalho e aprendizado ........ ................................................ ....... 25
Seção 8.6: Correspondência ................................................ ................................................ ................................................ . 29
Seção 8.7: Obter dados de ................................................ ................................................ ................................ 30
amostra Seção 8.8: Remover documentos que possuem um campo duplicado em uma coleção (dedupe) ....................... ......................
30 Seção 8.9: Left Outer Join com agregação ( $Lookup) ............... ................................................ .................... 30 Seção 8.10:
Agregação de servidores ....................... ................................................ ................................................ .. 31 Seção 8.11: Agregação
em um método de servidor Seção 8.12: Exemplo de ................................................ ................................................ ...... 31
Java e Spring .............................. ................................................ ................................ 32
Machine Translated by Google
Seção 14.1: Conecte-se ao MongoDB usando pymongo ....................................... ................................................ .... 48 Seção 14.2:
Consultas PyMongo ...................................... ................................................ ......................................... 48 Seção 14.3: Atualizar
todos os documentos em uma coleção usando o PyMongo .............................................. ......................... 49
Capítulo 15: Mongo como fragmentos ................................................ ................................................ .......................... 50
do conjunto de réplicas do MongoDB Capítulo 18: MongoDB - Configurar um ReplicaSet para oferecer suporte a TLS/
SSL ............. ................................ 56 Seção 18.1: Como configurar um ReplicaSet para suportar TLS/
SSL? ................................................ ....................... 56 Seção 18.2: Como conectar seu cliente (Mongo Shell) a um
ReplicaSet? ................................................ .......... 58 Capítulo 19: Mecanismos de Autenticação no MongoDB .............................. .....................
Seção 19.1: Mecanismos de Autenticação ................................................ ................................................ ............. 60
Capítulo 20: Modelo de autorização do MongoDB ................................................ ............................................. 61
Seção 20.1: Funções incorporadas ................................................ ................................................ ......................................... 61
Capítulo 21: Configuração .............................................. ................................................ ......................................... 62
Seção 21.1: Iniciando o mongo com um arquivo de configuração específico ................................................ ......................................... 63
22.1: Mongodump básico da instância mongod padrão local Seção 22.2: ................................................ ..................... 64
Mongorestore básico do dump mongod padrão local ....................... ................................................ 64
Machine Translated by Google
Sobre
https://goalkicker.com/MongoDBBook
Este é um livro gratuito não oficial criado para fins educacionais e não é afiliado a grupos
ou empresas oficiais do MongoDB® nem ao Stack Overflow. Todas as marcas comerciais e
marcas registradas são de propriedade de seus respectivos
proprietários de empresas
As informações apresentadas neste livro não são garantidas como corretas ou precisas,
use por sua conta e risco
3.4 29/11/2016
3.2 2015-12-08
3.0 03/03/2015
2.6 2014-04-08
2.4 19/03/2013
2.2 29/08/2012
2.0 2011-09-12
1.8 16/03/2011
1.6 31-08-2010
1.4 2010-03-25
1.2 2009-12-10
Explicação: Esta operação executa o script myjsfile.js em um shell mongo que se conecta ao banco de dados mydb na instância mongod acessível
por meio da interface localhost na porta 27017. localhost:27017 não é obrigatório, pois é a porta padrão que o mongodb usa.
>load("meujsfile.js")
> db.test.insert({"chave":"valor1","chave2":"Val2","chave3":"val3"})
WriteResult({ "nInserted" : 1 }) >
db.test.insert({"chave":"valor2","chave2":"Val21","chave3":"val31"})
WriteResult({ "nInserted" : 1 }) >
db.test.insert({"key":"value3","key2":"Val22","key3":"val33"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5790c5cecae25b3d38c3c7ae"), "key" : "value1", "key2" : "Val2 ", "key3" : "val3" }
{ "_id" : ObjectId
("5790c5d9cae25b3d38c3c7af"), "key" : "value2", "key2" : "Val2 1", "key3" : "val31" } { "_id" :
> db.test.find().pretty()
{
"_id" : ObjectId("5790c5cecae25b3d38c3c7ae"), "chave" :
"valor1", "chave2" :
"Val2", "chave3" :
"val3"
}{
"_id" : ObjectId("5790c5d9cae25b3d38c3c7af"), "chave" :
"valor2", "chave2" :
"Val21", "chave3" :
"val31"
}{
"_id" : ObjectId("5790c5e9cae25b3d38c3c7b0"), "chave" :
"valor3", "chave2" :
"Val22", "chave3" :
"val33"
}
>
Mesa Coleção
Instalando manualmente:
Baixe a versão mais recente aqui. Certifique-se de que está baixando o arquivo apropriado, especialmente verifique se o
tipo do seu sistema operacional é de 32 ou 64 bits. O arquivo baixado está no formato tgz.
Vá para o diretório onde este arquivo foi baixado. Em seguida digite o seguinte comando:
Em vez de xyz, haveria algumas informações de versão e tipo de sistema. A pasta extraída teria o
mesmo nome do arquivo tgz . Dentro da pasta, haveria uma subpasta chamada bin que conteria
vários arquivos binários junto com mongod e mongo.
Por padrão, o servidor mantém os dados na pasta /data/db. Então, temos que criar esse diretório e, em seguida,
$ sudo bash
# mkdir -p / data/ db #
chmod 777 / data #
chmod 777 / data/ db # exit
Para iniciar o servidor, o seguinte comando deve ser dado a partir do local atual:
$ ./mongod
Para iniciar o cliente, um novo terminal deve ser aberto com o mesmo diretório de antes. Em seguida, o seguinte
comando iniciaria o cliente e se conectaria ao servidor.
$ ./mongo
Por padrão, ele se conecta ao banco de dados de teste . Se você vir a linha conectando-se a: test. Então você instalou
o MongoDB com sucesso. Parabéns! Agora, você pode testar o Hello World para ficar mais confiante.
Para Windows:
Baixe a versão mais recente aqui. Certifique-se de que está baixando o arquivo apropriado, especialmente verifique se o tipo do
seu sistema operacional é de 32 ou 64 bits.
O arquivo binário baixado tem extensão exe. Executá-lo. Ele solicitará um assistente de instalação.
Clique em Avançar.
Clique em Instalar. Pode abrir uma janela para solicitar a permissão do administrador. Clique em Sim.
Agora, o mongodb está instalado no caminho C:/Program Files/MongoDB/Server/3.2/bin. Ao invés da versão 3.2, pode haver
alguma outra versão para o seu caso. O nome do caminho seria alterado de acordo.
bin diretório contém vários arquivos binários junto com mongod e mongo. Para executá-lo de outra pasta, você pode adicionar o
caminho no caminho do sistema. Para fazer:
Agora, crie uma pasta chamada data tendo uma subpasta chamada db onde você deseja executar o servidor.
Inicie o prompt de comando a partir deles. Mudando o caminho em cmd ou clicando em Abrir janela de comando aqui , que
ficará visível após clicar com o botão direito do mouse no espaço vazio da pasta GUI pressionando
> mongod
> mongo
Por padrão, ele se conecta ao banco de dados de teste . Se você vir a linha conectando-se a: test. Então você instalou o MongoDB
com sucesso. Parabéns! Agora, você pode testar o Hello World para ficar mais confiante.
Para Linux: Quase igual ao Mac OS, exceto que algum comando equivalente é necessário.
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 gpg: Número total
processado: 1\ importado: 1 (RSA: 1) gpg:
Instale o MongoDB.
$ vi /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=Repositório MongoDB
baseurl=https:// repo.mongodb.org/ yum/ redhat/ $releasever/ mongodb-org/ 3.4/ x86_64/ gpgcheck=1
habilitado=1
Instalar o MongoDB
mostrar dbs;
Selecione um banco de dados específico para acessar, por exemplo, mydb. Isso criará mydb se ainda não existir:
usar mydb;
Mostrar todas as coleções no banco de dados (certifique-se de selecionar uma primeiro, veja acima):
mostrar coleções;
Mostrar todas as funções que podem ser usadas com o banco de dados:
db.mydb.help();
> db
meudb
db.dropDatabase()
Após o processo de instalação, as seguintes linhas devem ser inseridas no shell mongo (terminal do cliente).
Olá Mundo!
Explicação:
Na primeira linha, inserimos um documento emparelhado { key : value } no teste de banco de dados padrão e na coleção chamada
world.
Na segunda linha, recuperamos os dados que acabamos de inserir. Os dados recuperados são mantidos em uma variável javascript
chamada cur. Então, pela função next() , recuperamos o primeiro e único documento e o mantemos em outra variável js chamada x. Em
seguida, imprimiu o valor do documento fornecendo a chave.
Ou
A diferença com salvar é que se o documento passado contiver um campo _id , se já existir um documento com esse _id ele será atualizado ao invés
de ser adicionado como novo.
Dois novos métodos para inserir documentos em uma coleção, no MongoDB 3.2.x:
db.people.insertMany([{nome: 'Tom', idade: 28},{nome: 'John', idade: 25}, {nome: 'Kathy', idade: 23}])
Observe que inserir é realçado como obsoleto em todos os drivers de idioma oficial desde a versão 3.0. A distinção completa é que os métodos de
shell realmente ficaram para trás dos outros drivers na implementação do método. A mesma coisa se aplica a todos os outros métodos CRUD
Você também pode atualizar vários documentos simultaneamente adicionando um terceiro parâmetro. Esta consulta atualizará todos
os documentos em que o nome for igual a Tom:
Se um novo campo estiver chegando para atualização, esse campo será adicionado ao documento.
Nota: Os campos que você usa para identificar o objeto serão salvos no documento atualizado. Os campos que não forem definidos na seção de
atualização serão removidos do documento.
// Todas as versões
db.people.remove({name: 'Tom'})
Ou apenas um
// Todas as versões
db.people.remove({name: 'Tom'}, true)
Método remove() do MongoDB . Se você executar este comando sem nenhum argumento ou sem argumento vazio, todos os documentos serão
removidos da coleção.
db.pessoas.remove();
ou
db.pessoas.remove({});
Consulte todos os documentos na coleção de pessoas que possuem um campo de nome com o valor 'Tom':
db.pessoas.find({nome: 'Tom'})
Ou apenas o primeiro:
db.people.findOne({nome: 'Tom'})
Você também pode especificar quais campos retornar passando um parâmetro de seleção de campo. O seguinte excluirá o campo _id e incluirá apenas
o campo age :
Observação: por padrão, o campo _id será retornado, mesmo que você não solicite. Se você não quiser obter o _id de volta, basta seguir o exemplo
anterior e solicitar que o _id seja excluído especificando _id: 0 (ou _id: false). , cidade, etc
db.people.find({'address.country': 'US'})
db.people.find({'address.country': 'US'}, {'name': true, 'address.city': true})Lembre-se que o resultado tem um método
`.pretty()` que bastante- imprime o JSON resultante:
db.pessoas.find().pretty()
Atualize as marcas de Tom para 55, onde as marcas são 50 (use o operador posicional $):
{nome: 'Tom', idade: 28, notas: [{assunto: "Inglês", notas: 90},{assunto: "Matemática", notas: 100}, {assunto:
"Calculações", notas: 20}] }
Usando {name: "Tom", "marks.subject": "English"} você obterá a posição do objeto na matriz de marcas, onde o assunto é o inglês. Em "marks.
$.marks", $ é usado para atualizar nessa posição do array de marcas
O operador posicional $ identifica um elemento em uma matriz para atualizar sem especificar explicitamente a posição do elemento na matriz.
Para atualizar 80 para 82 na matriz de notas no primeiro documento, use o operador posicional $ se você não souber a posição do elemento na
matriz:
db.students.update( { _id:
1, notas: 80 }, { $set:
{ "grades.$" : 82 } }
O operador $pull é o oposto de $push, você pode extrair itens específicos de arrays.
O operador $pop permite remover o primeiro ou o último valor de uma matriz. Digamos que o documento de Tom tenha uma
propriedade chamada brothers que tem o valor ['Marie', 'Bob', 'Kevin', 'Alex'].
Para atualizar vários documentos em uma coleção, defina a opção multi como true.
db.collection.update(
consulta,
atualização,
{
upsert: booleano,
multi: booleano,
writeConcern: documento
}
)
multi é opcional. Se definido como true, atualiza vários documentos que atendem aos critérios de consulta. Se definido como falso,
atualiza um documento. O valor padrão é falso.
mostrar coleções
ou
mostrar tabelas
ou
db.getCollectionNames()
mostrar dbs
ou
db.adminCommand('listDatabases')
ou
db.getMongo().getDBNames()
db.collection.find({});
recuperar documentos em uma coleção usando uma condição (semelhante a WHERE no MYSQL)
db.users.find({email:"sample@email.com"});
// E
db.collection.find( { $e:
[ { chave:
valor }, { chave: valor } ]
})
// OU
db.collection.find( { $or:
[ { chave:
valor }, { chave: valor } ]
})
// NÃO
db.inventory.find( { chave: { $não: valor } } )
NOTA: find() continuará procurando na coleção mesmo se uma correspondência de documento for considerada , Portanto, é
ineficiente quando usada em uma coleção grande , no entanto, modelando cuidadosamente seus dados e/ou usando índices, você pode
aumentar a eficiência de find()
a funcionalidade de consulta é semelhante a find(), mas isso encerrará a execução no momento em que encontrar um documento que corresponda
à sua condição , se usado com um objeto vazio, ele buscará o primeiro documento e o retornará. findOne() mongodb api
documentação
Semelhante aos métodos de agregação, também pelo método find() você tem a possibilidade de limitar, pular, classificar e contar os resultados.
Digamos que temos a seguinte coleção:
db.test.find({})
Retornará:
db.test.find({}).skip(3)
Retornará:
Retornará:
db.test.find({}).count()
Retornará:
Também são permitidas combinações destes métodos. Por exemplo, obtenha 2 documentos da coleção classificada decrescente,
ignorando o primeiro 1:
Retornará:
> db.students.find().pretty();
{
"_id" : ObjectId("58f29a694117d1b7af126dca"),
"studentNo" : 1,
"firstName" : "Prosen",
"lastName" : "Ghosh",
"idade" : 25
}{
"_id" : ObjectId("58f29a694117d1b7af126dcb"),
"studentNo" : 2,
"firstName" : "Rajib",
"lastName" : "Ghosh",
"idade" : 25
}{
"_id" : ObjectId("58f29a694117d1b7af126dcc"),
"studentNo" : 3,
"firstName" : "Rizve",
"lastName" : "Amin",
"idade" : 23
}{
"_id" : ObjectId("58f29a694117d1b7af126dcd"),
"studentNo" : 4,
"firstName" : "Jabed",
"lastName" : "Bangali",
"idade" : 25
}{
"_id" : ObjectId("58f29a694117d1b7af126dce"),
"studentNo" : 5,
"firstName" : "Gm",
"lastName" : "Anik",
"idade" : 23
}
SELECIONE * DE alunos;
db.students.find({firstName:"Prosen"});
E Consultas
db.students.find({ "firstName":
"Prosen",
"age": { "$gte": 23
}
});
Ou consultas
db.students.find({ "$or":
[{ "firstName":
"Prosen" }, { "age": { "$gte":
23
}
}]
});
E OR Consultas
db.students.find({
db.students.find(lastName:{$in:["Ghosh", "Amin"]})
> db.COLLECTION_NAME.find({},{KEY:1});
Se você deseja mostrar todos os documentos sem o campo de idade, o comando é o seguinte
db.pessoas.find({},{idade : 0});
> db.COLLECTION_NAME.find({},{KEY:1});
Se você deseja mostrar todos os documentos sem o campo de idade, o comando é o seguinte
> db.pessoas.find({},{idade:0});
> db.pessoas.find({},{idade:1});
Nota: o campo _id é sempre exibido durante a execução do método find() , se você não quiser este campo, então você precisa definir
como 0.
> db.people.find({},{nome:1,_id:0});
Observação: 1 é usado para mostrar o campo enquanto 0 é usado para ocultar os campos.
Uma diferença significativa entre MongoDB e RDBMS é que o MongoDB tem muitos tipos de operadores. Um deles é o operador de atualização, que
é usado em instruções de atualização.
Suponha que temos uma coleção de alunos para armazenar as informações dos alunos (exibição de tabela):
Um dia você consegue um emprego que precisa mudar o gênero de Tom de "M" para "F". Isso é fácil, certo? Então você escreve a declaração abaixo
muito rapidamente com base em sua experiência com RDBMS:
db.student.update( {nome:
'Tom'}, // critérios de consulta {sexo:
'F'} // ação de atualização
);
Perdemos a idade e o nome de Tom! A partir deste exemplo, podemos saber que todo o documento será substituído se não houver nenhum
operador de atualização na instrução de atualização. Este é o comportamento padrão do MongoDB.
3. Operador $set
Se quisermos alterar apenas o campo 'sexo' no documento de Tom, podemos usar $set para especificar qual(is) campo(s) queremos atualizar:
db.student.update( {name:
'Tom'}, // critério de consulta {$set: {sex:
'F'}} // ação de atualização
);
O valor de $set é um objeto, seus campos representam os campos que você deseja atualizar nos documentos e os valores desses campos são os valores
de destino.
Além disso, se você quiser alterar 'sexo' e 'idade' ao mesmo tempo, poderá anexá-los a $set :
db.student.update( {name:
'Tom'}, // critério de consulta {$set: {sexo:
'F', idade: 40}} // ação de atualização
);
_id é um número hexadecimal de 12 bytes que garante a exclusividade de cada documento. Você pode fornecer _id ao inserir o
documento. Se você não forneceu, o MongoDB fornece um ID exclusivo para cada documento. Esses 12 bytes, os primeiros 4
bytes para o registro de data e hora atual, os próximos 3 bytes para a identificação da máquina, os próximos 2 bytes para a
identificação do processo do servidor mongodb e os 3 bytes restantes são valores incrementais simples.
db.mycol.insert({ _id:
ObjectId(7df78ad8902c), title:
'MongoDB Overview',
description: 'MongoDB is no sql database', by:
'tutorials point', url: 'http://
www.tutorialspoint.com ', tags: ['mongodb',
'database', 'NoSQL'], curtidas: 100 })
Aqui mycol é um nome de coleção, se a coleção não existir no banco de dados, o MongoDB criará essa coleção e inserirá o
documento nela. No documento inserido, se não especificarmos o parâmetro _id , o MongoDB atribuirá um ObjectId exclusivo para
este documento.
Capítulo 7: Coleções
Seção 7.1: Criar uma coleção
Primeiro selecione ou crie um banco de dados.
Opcional. Opções de configuração para criar uma coleção limitada ou para pré-alocar espaço no documento de
opções de uma nova coleção.
O exemplo a seguir mostra a sintaxe do método createCollection() com algumas opções importantes
>db.createCollection("newCollection4", {capped :true, autoIndexId : true, size : 6142800, max : 10000}) { "ok" : 1 }
As operações db.collection.insert() e db.collection.createIndex() criam suas respectivas coleções, caso ainda não existam.
> db.newCollection1.drop()
verdadeiro
Nota: Se a coleta for descartada com sucesso, o método retornará true, caso contrário, retornará false.
Capítulo 8: Agregação
Matriz de Detalhes
pipeline de parâmetro (uma sequência de operações ou estágios de agregação de
dados) documento de opções (opcional, disponível somente se o pipeline estiver presente como uma matriz)
As operações de agregação processam registros de dados e retornam resultados calculados. As operações de agregação agrupam valores de
vários documentos e podem executar várias operações nos dados agrupados para retornar um único resultado. O MongoDB fornece três
maneiras de executar a agregação: o pipeline de agregação, a função map-reduce e os métodos de agregação de propósito único.
Como você obtém o número de transações de débito e crédito? Uma maneira de fazer isso é usando a função count () conforme abaixo.
ou
Mas e se você não souber os valores possíveis de cr_dr antecipadamente. Aqui a estrutura de agregação vem para jogar. Consulte a consulta
agregada abaixo.
> db.transactions.aggregate( [
{
$group :
{ _id : '$cr_dr', // agrupa por tipo de transação
// Adiciona 1 para cada documento à contagem para este tipo de transação count : {$sum : 1}
}
}
]
);
E o resultado é
{
"_id" : "C",
"contagem" : 3
}{
"_id" : "D",
"contagem" : 5
}
> db.transactions.aggregate(
[
{
$group : { _id :
'$cr_dr', count :
{$sum : 1}, //conta o número totalAmount : {$sum : '$amount'}
// soma o valor
}
}
]
);
E o resultado é
{
"_id" : "C",
"count" : 3,0,
"totalAmount" : 120,0
}{
"_id" : "D",
"count" : 5,0,
"totalAmount" : 410,0
}
> db.transactions.aggregate( [
{
$group : { _id :
'$cr_dr', count :
{$sum : 1}, totalAmount :
{$sum : { $sum : ['$amount', '$fee']}}
}
}
]
);
E o resultado é
{
"_id" : "C",
"count" : 3,0,
"totalAmount" : 128,0
}{
"_id" : "D",
"count" : 5,0,
"totalAmount" : 422,0
}
> db.transactions.aggregate(
[
{
$group :
{ _id : '$cr_dr', // agrupa por tipo de transação (débito ou crédito) count : {$sum : 1}, //
número de transações para cada tipo totalAmount : {$sum : { $sum : ['$amount',
'$fee']}}, // soma averageAmount : {$avg : { $sum : ['$amount', '$fee']}} // média
}
}
]
)
O resultado é
{
"_id" : "C", // Valores para transações de crédito "count" : 3.0,
"totalAmount" :
128.0, "averageAmount" :
40.0
}{
"_id" : "D", // Valores para transações de débito "count" : 5.0,
"totalAmount" :
422.0, "averageAmount" :
82.0
}
Um aviso importante é que quando um documento não contém o array ele será perdido. A partir do mongo 3.2, há uma opção de desenrolamento
"preserveNullAndEmptyArrays" adicionada. Esta opção garante que o documento seja preservado quando o array estiver ausente.
db.employees.insert({"name":"Anna","dept":"Admin","languages":["english","hindi"],"age":35,
"totalExp":11});
db.employees.insert({"name":"Bob","dept":"Instalações","idiomas":["inglês","hindi"],"idade":36, "totalExp":14} ) ;
db.employees.insert({"name":"Cathy","dept":"Instalações","idiomas":["hindi"],"idade":31, "totalExp":4}) ;
db.employees.aggregate([{$match:{dept:"Admin"}}]); Saída:
{ "_id" :
ObjectId("54982fac2e9b4b54ec384a0d"), "name" : "Adma", "dept" : "Admin", "idiomas" : "alemão", "francês", "inglês", "hindi" ] , [
"age" : 30, "totalExp" : 10 } { "_id" : ObjectId("54982fc92e9b4b54ec384a0e"), "name" : "Anna",
"dept" : "Admin", "languages" : "english", " hindi" ], "idade" : 35, "totalExp" : 11 } [
estágio do projeto incluirá o campo _id automaticamente, a menos que você especifique para desabilitar.
3. Group: $group é usado para agrupar documentos por campo específico, aqui os documentos são agrupados pelo valor do campo "dept".
Outro recurso útil é que você pode agrupar por nulo, o que significa que todos os documentos serão agregados em um.
db.employees.aggregate([{$group:{"_id":"$dept"}}]);
{ "_id" : "HR" }
{ "_id" : "Instalações" }
{ "_id" : "Administrador" }
"noOfEmployee" : 183 }
8. Obtendo o valor do campo específico do primeiro e do último documento de cada grupo: Funciona bem quando o resultado do
documento é classificado.
10. Push e addToSet: Push adiciona o valor de um campo de cada documento do grupo a um array usado para projetar dados em formato
array, addToSet é semelhante a push mas omite valores duplicados.
{ "_id" : "depto", "arrPush" : [ 30, 35, 35, 35, 26, 25 ], "arrSet" : [ 25, 26, 35, 30 ] }
11. Unwind: Usado para criar vários documentos na memória para cada valor no campo de tipo de matriz especificado, então podemos fazer mais
agregações com base nesses valores.
ObjectId("54982fac2e9b4b54ec384a0d"), "name" : "Adma", "dept" : "HR", "idiomas" : "german", "age" : 30, "totalExp" :
10 } { "_id" : ObjectId("54982fac2e9b4b54ec384a0d"),
"name" : "Adma", "dept" : "HR", "idiomas" : "francês", "idade" : 30, "totalExp" : 10 } { " _id" :
ObjectId("54982fac2e9b4b54ec384a0d"), "name" :
"Adma", "dept" : "HR", "languages" : "english", "age" : 30, "totalExp" : 10 } { "_id" : ObjectId("54982fac2e9b4b54ec384a0d"),
"name" : "Adma", "dept" : "HR", "languages" :
"hindi", "age" : 30, "totalExp" : 10 }
12. Classificação:
13. Pular:
14. Limite:
Saída:
Lista de operadores de comparação: $cmp, $eq, $gt, $gte, $lt, $lte e $ne
Output:
{ "_id" : ObjectId("57ff3e553dedf0228d4862ac"), "name" : "Adma", "dept" : "Admin", "age" : false }
db.employees.aggregate([{$match:{dept:"Admin", $and: [{age: { $gt: 30 }}, {age: {$lt: 36 }} ] }}, {$project :{"nome":1, "depto":1,
idade: { $e: [ { $gt: [ "$idade", 30 ] }, { $lt: [ "$idade", 36 ] } ] } }}]); Saída: { "_id" : ObjectId("57ff3e5e3dedf0228d4862ad"),
"name" :
"Anna", "dept" : "Admin", "age" : true }
Como escrever uma consulta para obter todos os departamentos em que a idade média dos funcionários que ganham menos ou $ 70.000
é maior ou igual a 35?
Para isso, precisamos escrever uma consulta para corresponder aos funcionários que têm um salário menor ou igual a US$ 70.000. Em
seguida, adicione o estágio agregado para agrupar os funcionários por departamento. Em seguida, adicione um acumulador com um campo chamado,
por exemplo, average_age para encontrar a idade média por departamento usando o $avg acumulador e abaixo dos agregados $match e $group
existentes, adicione outro agregado $match para que possamos recuperar apenas resultados com um average_age que é maior ou igual a 35.
db.employees.aggregate([ {"$match":
{"salary": {"$lte": 70000}}}, {"$group": {"_id": "$dept",
"average_age": { "$média":
"$idade"} }
},
{"$match": {"average_age": {"$gte": 35}}} ])
O resultado é:
{
"_id": "IT",
"average_age": 31
}{
"_id": "Atendimento ao Cliente",
"idade_média": 34,5
}{
"_id": "Finanças",
"average_age": 32,5
}
db.transactions.aggregate([ { $group:
{ _id: { cr_dr:
"$cr_dr"}, dups: { "$addToSet":
"$_id" }, contagem: { "$sum": 1 }
} }, { $match:
{ count: { "$gt":
1 } }} ],allowDiskUse:
) }) // printjson(duplicados);
$lookup:
{ from: "col_2",
localField: "id",
Este recurso foi lançado recentemente no mongodb versão 3.2 com os , que dá ao usuário um estágio para ingressar em uma coleção
atributos correspondentes de outra coleção
// Seus argumentos para a agregação do Mongo. Faça como quiser. var pipeline =
[ { $match:
doSomethingWith(args) }, { $group: {
_id: whatWeAreGroupingWith(args),
contagem: { $soma: 1 }
}}
];
});
});
sub.pronto();
},
function(error)
"
{ Meteor._debug( "Erro ao fazer agregação: + erro);
}
)
);
});
Aqui está um exemplo que você pode usar no Meteor 1.3 e superior:
Meteor.methods({ 'aggregateUsers'(someId)
{ const collection = MyCollection.rawCollection() const
agregado = Meteor.wrapAsync(collection.aggregate, collection)
resultados const =
agregado([ { $match:
match }, { $group: group }
])
resultados de retorno
}
})
tente
{ MongoClient mongo = new MongoClient(); DB
db = mongo.getDB("so");
DBCollection coll = db.getCollection("funcionários");
// Equivalente a $match
DBObject matchFields = new BasicDBObject();
matchFields.put("depto", "Admin");
DBObject match = new BasicDBObject("$match", matchFields);
// Equivalente a $project
DBObject projectFields = new BasicDBObject();
projectFields.put("_id", 1);
projectFields.put("nome", 1);
projectFields.put("depto", 1);
projectFields.put("totalExp", 1);
projectFields.put("idade", 1);
projectFields.put("idiomas", 1); DBObject
project = new BasicDBObject("$project", projectFields);
// Equivalente a $group
DBObject groupFields = new BasicDBObject("_id", "$dept");
groupFields.put("ageSet", new BasicDBObject("$addToSet", "$age")); DBObject
employeeDocProjection = new BasicDBObject("$addToSet", novo
BasicDBObject("totalExp", "$totalExp").append("idade", "$idade").append("idiomas",
"$idiomas").append("dept", "$dept").append( "nome", "$nome"));
groupFields.put("docs", employeeDocProjection); DBObject
group = new BasicDBObject("$group", groupFields);
[{
"_id": "Admin",
"ageSet": [35.0, 30.0],
"docs":
[{ "totalExp": 11.0,
"age": 35.0,
"languages": ["english", "hindi"], "dept":
"Admin", "name":
"Anna" },
}]
}]
O "resultSet" contém uma entrada para cada grupo, "ageSet" contém a lista de idade de cada funcionário desse grupo, "_id" contém
o valor do campo que está sendo utilizado para agrupamento e "docs" contém os dados de cada funcionário desse grupo que
pode ser usado em nosso próprio código e interface do usuário.
Capítulo 9: Índices
Seção 9.1: Noções básicas de criação de índice
db.transactions.getIndexes();
[
{
"v" : 1,
"chave" :
{ "_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
Já existe um índice para coleta de transações. Isso ocorre porque o MongoDB cria um índice exclusivo no campo _id durante a criação de uma
coleção. O índice _id impede que os clientes insiram dois documentos com o mesmo valor para o campo _id . Você não pode descartar esse índice
no campo _id .
{
"createdCollectionAutomatically" : falso,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2, "ok" :
1
}
O createdCollectionAutomatically indica se a operação criou uma coleção. Se uma coleção não existir, o MongoDB criará a coleção
como parte da operação de indexação.
{
"v" : 1,
"chave" :
{ "_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"chave" :
{ "cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
Agora você vê que a coleção de transações tem dois índices. Índice _id padrão e cr_dr_1 que criamos. O nome é atribuído pelo
MongoDB. Você pode definir seu próprio nome como abaixo.
[
{
"v" : 1,
"chave" :
{ "_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"chave" :
{ "cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"chave" :
{ "cr_dr" : -1
},
"name" : "index on cr_dr desc", "ns" :
"documentation_db.transactions"
}
]
Ao criar o índice { cr_dr : -1 } 1 significa que o índice estará em ordem crescente e -1 em ordem decrescente .
Versão 2.4
índices de hash
Os índices também podem ser definidos como hash. Isso é mais eficaz em consultas de igualdade, mas não é eficiente para
consultas de intervalo; no entanto, você pode definir índices hash e ascendentes/descendentes no mesmo campo.
> db.transactions.getIndexes( [
{
"v" : 1,
"chave" :
{ "_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"chave" :
{ "cr_dr" : "hashed"
},
"name" : "cr_dr_hashed", "ns" :
"documentation_db.transactions"
}
]
db.collection.dropIndex('name_of_index');
db.collection.dropIndex( { 'name_of_field' : -1 } );
Isso pode ser particularmente útil para campos opcionais, mas que também devem ser exclusivos.
Como duas entradas não têm "apelido" especificado e a indexação tratará os campos não especificados como nulos, a criação do índice falharia com 2 documentos
Índices esparsos são mais compactos, pois ignoram/ignoram documentos que não especificam esse campo. Portanto, se você tiver uma coleção em que apenas
menos de 10% dos documentos especifiquem esse campo, poderá criar índices muito menores - aproveitando melhor a memória limitada se quiser fazer consultas
como:
db.scores.find({'apelido': 'Johnnie'})
Índices parciais:
Os índices parciais representam um superconjunto da funcionalidade oferecida pelos índices esparsos e devem ser preferidos aos
índices esparsos. (Novo na versão 3.2)
db.restaurants.createIndex( { cozinha:
1 },
{ parcialFilterExpression: { rating: { $gt: 5 } } }
)
Se a classificação for superior a 5, a culinária será indexada. Sim, podemos especificar uma propriedade a ser indexada com base no valor de outras
propriedades também.
Índices esparsos selecionam documentos para indexar apenas com base na existência do campo indexado ou, para índices compostos, na existência
dos campos indexados.
Índices parciais determinam as entradas de índice com base no filtro especificado. O filtro pode incluir campos diferentes das chaves de índice e pode
especificar condições diferentes de apenas uma verificação de existência.
Ainda assim, um índice parcial pode implementar o mesmo comportamento de um índice esparso
Por exemplo:
db.contacts.createIndex( { nome:
1 },
{ parcialFilterExpression: { nome: { $existe: verdadeiro } } }
)
Observação: a opção parcialFilterExpression e a opção esparsa não podem ser especificadas ao mesmo tempo.
db.collection.getIndexes();
Saída
[
{
"v" : 1,
"chave" :
{ "_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"chave" :
{ "cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"chave" :
{ "cr_dr" : -1
},
"name" : "index on cr_dr desc", "ns" :
"documentation_db.transactions"
}
]
Isso cria um índice em vários campos, neste caso nos campos de nome e idade . Será ascendente em nome e descendente
em idade.
Nesse tipo de índice, a ordem de classificação é relevante, pois determinará se o índice pode suportar uma operação de classificação
ou não. A classificação reversa é suportada em qualquer prefixo de um índice composto, desde que a classificação esteja na direção de
classificação reversa para todas as chaves na classificação. Caso contrário, a classificação de índices compostos precisa corresponder à
ordem do índice.
A ordem dos campos também é importante, neste caso o índice será ordenado primeiro por nome, e dentro de cada valor de nome, ordenado
pelos valores do campo idade . Isso permite que o índice seja usado por consultas no campo nome ou no nome e idade, mas não apenas na
idade .
impõe exclusividade no índice definido (simples ou composto). A construção do índice falhará se a coleção já contiver valores
duplicados; a indexação também falhará com várias entradas sem o campo (uma vez que todas serão indexadas com o valor
nulo) , a menos que sparse: true seja especificado.
Nesse tipo de índice, a ordem de classificação é irrelevante, porque o mongo pode percorrer o índice em ambas as direções.
db.people.dropIndex("nameIndex")
db.pessoas.dropIndex({nome: 1})
db.pessoas.getIndexes()
Isso retornará uma matriz de documentos, cada um descrevendo um índice na coleção de pessoas
{
"nome": "Alice",
"salário": "57871",
"dob": "1986-08-21"
},
{
"nome": "Bob",
"salário": "48974",
"dob": "1990-11-04"
}
{
"nome": "Alice",
"salário": 57871,
"dob": ISODate("1986-08-21T00:00:00.000Z")
},
{
"nome": "Bob",
"salário": 48974,
"dob": ISODate("1990-11-04T00:00:00.000Z")
}
Para dados relativamente pequenos, pode-se alcançar o acima iterando a coleção usando um instantâneo com o método
forEach() do cursor e atualizando cada documento da seguinte forma:
Embora isso seja ideal para pequenas coleções, o desempenho com grandes coleções é bastante reduzido, pois percorrer um
grande conjunto de dados e enviar cada operação de atualização por solicitação ao servidor incorre em uma penalidade
computacional.
O Massa() A API ajuda e melhora muito o desempenho, pois as operações de gravação são enviadas ao servidor apenas
uma vez em massa. A eficiência é alcançada porque o método não envia todas as solicitações de gravação para o servidor (como
acontece com a instrução de atualização atual dentro do forEach() loop), mas apenas uma vez a cada 1.000 solicitações,
tornando as atualizações mais eficientes e rápidas do que atualmente.
Usando o mesmo conceito acima com o forEach() loop para criar os lotes, podemos atualizar a coleção em massa da seguinte maneira.
Nesta demonstração, o método Bulk() A API disponível nas versões do MongoDB >= 2.6 e < 3.2 usa o initializeUnorderedBulkOp()
método para executar em paralelo, bem como em uma ordem não determinística, as operações de gravação nos lotes.
Ele atualiza todos os documentos na coleção de clientes alterando os campos salario e dob para valores numéricos e de data e
hora , respectivamente:
bulk = db.test.initializeUnorderedBulkOp();
}
});
O próximo exemplo se aplica ao novo MongoDB versão 3.2 , que desde então desativou o Bulk() API e forneceu um conjunto mais
recente de APIs usando bulkWrite().
Ele usa os mesmos cursores acima, mas cria os arrays com as operações em massa usando o mesmo forEach() cursor
para enviar cada documento de gravação em massa para a matriz. Como os comandos de gravação não podem aceitar
mais de 1.000 operações, é necessário agrupar operações para ter no máximo 1.000 operações e reinicializar a matriz
quando o loop atingir a iteração 1.000:
cursor.snapshot().forEach(function(doc){ var
newSalary = parseInt(doc.salary), newDob =
new ISODate(doc.dob);
Aqui, o campo de localização é a chave e 2dsphere é o tipo do índice. No exemplo a seguir vamos criar um índice 2dsphre na
coleção de lugares .
db.places.insert( {
No WiredTiger, não há atualizações no local. Se você precisar atualizar um elemento de um documento, um novo documento será inserido enquanto o documento antigo
será excluído.
O WiredTiger também oferece simultaneidade em nível de documento. Ele assume que duas operações de gravação não afetarão o mesmo documento, mas se afetarem,
uma operação será rebobinada e executada posteriormente. Isso é um grande aumento de desempenho se os retrocessos forem raros.
O WiredTiger oferece suporte aos algoritmos Snappy e zLib para compactação de dados e índices no sistema de arquivos. Snappy é o padrão. É menos intensivo em
Observação:
newWiredTigerDBPath não deve conter dados de outro mecanismo de armazenamento. Para migrar seus dados, você deve
MMAP é um mecanismo de armazenamento conectável que recebeu o nome do comando mmap() do Linux. Ele mapeia os arquivos para a memória virtual e otimiza as
chamadas de leitura. Se você tem um arquivo grande, mas precisa ler apenas uma pequena parte dele, mmap() é muito mais rápido do que uma chamada read() que
Uma desvantagem é que você não pode ter duas chamadas de gravação sendo processadas em paralelo para a mesma coleção. Portanto, o MMAP possui bloqueio
no nível da coleção (e não no nível do documento, como o WiredTiger oferece). Esse bloqueio de coleção é necessário porque um índice MMAP pode fazer referência a
vários documentos e, se esses documentos pudessem ser atualizados simultaneamente, o índice seria inconsistente.
Um mecanismo de armazenamento criado pela SanDisk que permite ignorar a camada do sistema de arquivos do sistema operacional e gravar diretamente
o dispositivo de armazenamento.
Um mecanismo de armazenamento criado pela Percona que usa índices de árvore fractal.
Para obter dados da coleção testcollection no banco de dados testdb onde name=dev
import org.bson.Document;
importar com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection; import
com.mongodb.client.MongoCursor; import
com.mongodb.client.MongoDatabase;
(cursor.hasNext())
{ System.out.println(cursor.next().toJson());
} } finalmente
{ cursor.close();
}
find(consulta).projection(campos).cursorType(CursorType.TailableAwait).iterator();
Ajustável
TailableAwait
Bytes.QUERYOPTION_TAILABLE
Bytes.QUERYOPTION_AWAITDATA
hostX Opcional. Você pode especificar quantos hosts forem necessários. Você especificaria vários hosts, por exemplo, para
conexões com conjuntos de réplicas.
:portX Opcional. O valor padrão é: 27017 se não for especificado.
Opcional. O nome do banco de dados a ser autenticado se a string de conexão incluir credenciais de autenticação
base de dados Se /database não for especificado e a string de conexão incluir credenciais, o driver será autenticado no banco de
dados admin.
uri = "mongodb://localhost:27017/"
cliente = MongoCliente(uri)
db.test_collection
coleção.save({"olá":"mundo"})
imprimir coleção.find_one()
objetos como ids de objeto ou ISODate são manipulados usando classes python. PyMongo usa seu próprio ObjectId class para
lidar com IDs de objetos, enquanto as datas usam o pacote datetime padrão . Por exemplo, se você deseja consultar todos
os eventos entre 2010 e 2011, pode fazer:
importar pymongo
O método find retorna um Cursor, no qual você pode iterar facilmente usando o for na sintaxe. Em seguida, chamamos o método update ,
especificando o _id e adicionamos um campo ($set). Os parâmetros upsert e multi vêm do mongodb (veja aqui para mais informações).
1. Servidor de configuração
2. Conjuntos de réplicas
3. Mongos
podemos escolher o servidor de configuração como conjunto de réplicas ou pode ser um servidor autônomo. Com base em nossa exigência, podemos escolher o melhor. Se a
configuração precisar ser executada no conjunto de réplicas, precisamos seguir a configuração do conjunto de réplicas
Configuração do MongoS: Mongos é a configuração principal no shard. É um roteador de consulta para acessar todos os conjuntos de réplicas
Configurar compartilhado:
3. sh.shardCollection("< banco de
dados >.< coleção >", { < chave > : < direção > } ) 4. sh.status() // Para garantir a fragmentação
Este exemplo mostra como configurar um conjunto de réplicas com três instâncias no mesmo servidor.
{
"set" : "rs0",
"date" : ISODate("2016-09-01T12:34:24.968Z"), "myState" :
1, "term" :
NumberLong(4),
"heartbeatIntervalMillis" : NumberLong(2000 ), [ "membros" :
{
"_id" : 0,
"nome" : "<hostname>:27017",
"saúde" : 1,
"estado" : 1,
"stateStr" : "PRIMARY",
..........................
},
{
"_id" : 1,
"nome" : "<hostname>:27018",
"saúde" : 1,
"estado" : 2,
"stateStr" : "SECONDARY",
..........................
},
{
"_id" : 2,
"nome" : "<nome do host>:27019",
"saúde" : 1,
"estado" : 2,
"estadoStr" : "SECONDARY",
..........................
}
],
"ok" : 1
}
Para simplificar, terei uma réplica definida com 3 instâncias do mongodb em execução no mesmo servidor e, portanto, para conseguir isso, todas as
três instâncias do mongodb seriam executadas em diferentes números de porta.
No ambiente de produção, onde você tem uma instância mongodb dedicada em execução em um único servidor, pode reutilizar os mesmos
números de porta.
1. Crie diretórios de dados (caminho onde os dados mongodb seriam armazenados em um arquivo)
O comando acima associa a instância do mongodb a um nome replicaSet "s0" e inicia a primeira instância do mongodb na porta 37017 com oplogSize
100 MB
O comando acima associa a instância do mongodb a um nome replicaSet "s0" e inicia a primeira instância do mongodb na porta 37018 com oplogSize
100 MB
O comando acima associa a instância do mongodb a um nome replicaSet "s0" e inicia a primeira instância do mongodb na porta 37019 com oplogSize
100 MB
Com todas as 3 instâncias iniciadas, essas 3 instâncias são independentes umas das outras atualmente. Agora precisaríamos agrupar essas
instâncias como um conjunto de réplicas. Fazemos isso com a ajuda de um objeto de configuração.
3.a Conecte-se a qualquer um dos servidores mongod por meio do shell mongo. Para fazer isso, abra o prompt de comando e digite.
3.b Para enviar (adicionar) instâncias mongod ao array de membros no objeto de configuração. No tipo de shell mongo
config.members.push({"_id":0,"host":"localhost:37017"});
config.members.push({"_id":1,"host":"localhost:37018"});
config.members.push({"_id":2,"host":"localhost:37019"});
Atribuímos a cada instância mongod um _id e um host. _id pode ser qualquer número exclusivo e o host deve ser o nome do host do servidor
no qual está sendo executado, seguido pelo número da porta.
rs.initiate(config)
5. Aguarde alguns segundos e teremos um conjunto de réplicas de 3 instâncias mongod em execução no servidor. digite o
seguinte comando para verificar o status do conjunto de réplicas e identificar qual é o principal e qual é o secundário.
rs.status();
Comando : rs.status()
Conecte qualquer um dos membros da réplica e acione este comando, ele fornecerá o estado completo do conjunto de réplicas
Exemplo :
{ "set" : "ReplicaName",
"date" : ISODate("2016-09-26T07:36:04.935Z"),
"myState" : 1,
"term" : NumberLong(-1),
"heartbeatIntervalMillis" : NumberLong (2000),
[ "membros" :
{
"_id" : 0,
"name" : "<IP>:<PORT>,
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5953744,
"optime" : timestamp (1474875364, 36),
"optimeDate" : ISODate("2016-09-26T07:36:04Z"),
"electionTime" : Timestamp(1468921646, 1),
"electionDate" : ISODate("2016-07-19T09:47 :26Z"),
"configVersion" : 6,
"self" : verdadeiro
},
{
"_id" : 1,
"nome" : "<IP>:<PORT>",
"saúde" : 1,
},
{
"_id" : 2,
"name" : "<IP>:<PORT>",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 5953696,
"lastHeartbeat" : ISODate("2016-09-26T07:36:03.183Z"), "lastHeartbeatRecv" :
ISODate("2016-09-26T07:36:03.715Z"), "pingMs" : NumberLong(0),
"configVersion" : 6
},
{
"_id" : 3,
"name" : "<IP>:<PORT>",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1984305,
"optime" : Timestamp(1474875361, 16),
"optimeDate" : ISODate("2016-09-26T07:36:01Z"), "lastHeartbeat" :
ISODate("2016-09-26T07:36:02.921Z"), "lastHeartbeatRecv" :
ISODate("2016-09-26T07:36:03.793Z"), "pingMs" : NumberLong(22),
"lastHeartbeatMessage" :
"sincronizando de: 10.9.52.56:10050", "syncingTo" : "10.9.52.56:10050 ",
"configVersion" : 6
}
],
"ok" : 1 }
Implantaremos um ReplicaSet de 3 nós em seu ambiente local e usaremos um certificado autoassinado. Não use um certificado autoassinado
em PRODUCTION.
Uma descrição dos certificados TLS/ SSL, PKI (Public Key Infrastructure) e Autoridade de Certificação está além do escopo desta
documentação.
O certificado raiz (também conhecido como arquivo CA) será usado para assinar e identificar seu certificado. Para gerá-lo, execute o comando
abaixo.
Guarde o certificado raiz e sua chave com cuidado, ambos serão usados para assinar seus certificados. O certificado raiz também pode ser
usado por seu cliente.
Ao gerar a solicitação de assinatura de certificado (também conhecida como CSR), insira o nome de host exato (ou IP) do seu nó no campo
Nome comum (também conhecido como CN). Os demais campos devem ter exatamente o mesmo valor. Pode ser necessário modificar
seu arquivo /etc/ hosts .
Os comandos abaixo vão gerar os arquivos CSR e as Chaves Privadas RSA (4096 bits).
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_1.key -out mongodb_node_1.csr openssl req
-nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_2.key -out mongodb_node_2.csr openssl req -nodes -newkey
rsa: 4096 -sha256 -keyout mongodb_node_3.key -out mongodb_node_3.csr
Você deve gerar um CSR para cada nó de seu ReplicaSet. Lembre-se que o Common Name não é o mesmo de um nó para outro. Não
baseie vários CSRs na mesma chave privada.
Use o Arquivo CA (ca.pem) e sua Chave Privada (ca.key) gerada anteriormente para assinar cada Solicitação de Certificado
executando os comandos abaixo.
openssl x509 -req -in mongodb_node_1.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_1.crt
openssl x509 -req -in
mongodb_node_2.csr -CA ca.pem -CAkey ca.key -set_serial 00 - out mongodb_node_2.crt openssl x509 -req -in
mongodb_node_3.csr
-CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_3.crt
Agora você deve ter 3 CSRs, 3 chaves privadas e 3 certificados autoassinados. Somente as Chaves Privadas e os Certificados serão
usados pelo MongoDB.
Cada certificado corresponde a um nó. Lembre-se cuidadosamente de qual CN / nome de host você deu a cada CSR.
Execute os comandos abaixo para concatenar cada certificado de nó com sua chave em um arquivo (requisito do MongoDB).
Assumiremos que seus arquivos pem estão localizados em sua pasta atual, bem como data/data1, data/data2 e data/data3.
Execute os comandos abaixo para implantar seu ReplicaSet de 3 nós escutando nas portas 27017, 27018 e 27019.
mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem
mongod --dbpath data/
data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem mongod --dbpath data/
data_3 --replSet rs0 --
port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem
Agora você tem um ReplicaSet de 3 nós implantado em seu ambiente local e todas as suas transações são criptografadas.
Você não pode se conectar a este ReplicaSet sem usar TLS.
Para forçar seu cliente a fornecer um Certificado de Cliente (SSL Mútuo), você deve adicionar o Arquivo CA ao executar suas
instâncias.
mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem --
sslCAFile ca.pem mongod --dbpath data/data_2
--replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile
Agora você tem um ReplicaSet de 3 nós implantado em seu ambiente local e todas as suas transações são criptografadas.
Você não pode se conectar a este ReplicaSet sem usar TLS ou sem fornecer um certificado de cliente confiável para sua autoridade de certificação.
Neste exemplo, podemos usar o arquivo CA (ca.pem) que você gerou durante a seção "Como configurar um ReplicaSet para oferecer suporte
a TLS/ SSL?" seção. Assumiremos que o arquivo CA está localizado em sua pasta atual.
Assumiremos que seus 3 nós estão sendo executados em mongo1:27017, mongo2:27018 e mongo3:27019. (Talvez seja necessário modificar
seu arquivo /etc/ hosts .)
No MongoDB 3.2.6, se o arquivo CA estiver registrado no Trust Store do sistema operacional, você poderá se conectar ao ReplicaSet sem
fornecer o arquivo CA.
Agora você está conectado ao seu ReplicaSet e todas as transações entre seu Mongo Shell e seu ReplicaSet são criptografadas.
Se o seu ReplicaSet solicitar um certificado de cliente, você deverá fornecer um assinado pela CA usada pela implantação do ReplicaSet.
Os passos para gerar o Certificado de Cliente são quase os mesmos para gerar o Certificado de Servidor.
De fato, você só precisa modificar o Common Name Field durante a criação do CSR. Em vez de fornecer 1 nome de host do nó no campo de
nome comum, você precisa fornecer todos os nomes de host do ReplicaSet separados por um
vírgula.
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr
...
Nome comum (por exemplo, FQDN do servidor ou SEU nome) []: mongo1,mongo2,mongo3
Você pode enfrentar a limitação de tamanho do Nome comum se o campo Nome comum for muito longo (mais de 64 bytes).
Para ignorar essa limitação, você deve usar o SubjectAltName ao gerar o CSR.
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr - config <( cat <<-EOF
[req]
default_bits = 4096
prompt = sem
default_md = sha256
req_extensions = req_ext
nome_ilustre = dn
[ dn ]
NC = .
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = mongo1
DNS.2 = mongo2
DNS.3 = mongo3
EOF )
openssl x509 -req -in mongodb_client.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt
Para se conectar ao seu ReplicaSet, agora você pode fornecer o certificado de cliente recém-gerado.
Agora você está conectado ao seu ReplicaSet e todas as transações entre seu Mongo Shell e seu ReplicaSet são criptografadas.
A autenticação é o processo de verificação da identidade de um cliente. Quando o controle de acesso, ou seja, a autorização, está ativado, o
MongoDB exige que todos os clientes se autentiquem para determinar seu acesso.
O MongoDB oferece suporte a vários mecanismos de autenticação que os clientes podem usar para verificar sua identidade. Esses
mecanismos permitem que o MongoDB se integre ao seu sistema de autenticação existente.
SCRAM-SHA-1
Autenticação Kerberos
Arquivo-
chave X.509
Controle de acesso à base de funções <br> Funções são grupos de privilégios, ações sobre recursos. Isso é ganho para os usuários em um determinado
namespace (Banco de dados). As ações são executadas nos recursos. Os recursos são qualquer objeto que mantém o estado no banco de dados.
Funções de usuário de banco de dados integradas e funções de administração de banco de dados existem em cada banco de dados.
1. leia
2. ler e escrever
systemLog.quiet falso
systemLog.traceAllExceptions falso
systemLog.syslogFacility do utilizador
-
systemLog.path
systemLog.logAppend falso
systemLog.logRotate renomear
systemLog.destination stdout
systemLog.timeStampFormat iso8601-local
systemLog.component.accessControl.verbosity 0
systemLog.component.command.verbosity 0
systemLog.component.control.verbosity 0
systemLog.component.ftdc.verbosity 0
systemLog.component.geo.verbosity 0
systemLog.component.index.verbosity 0
systemLog.component.network.verbo 0
systemLog.component.query.verbosity 0
systemLog.component.replication.verbosity 0
systemLog.component.sharding.verbosity 0
systemLog .component.storage.verbosity 0
systemLog.component.storage.journal.verbosity 0
systemLog.component.write.verbosity 0
processManagement.fork falso
processManagement.pidFilePath nenhum
net.port 27017
net.bindIp 0.0.0.0
net.maxIncomingConnections 65536
net.wireObjectCheck verdadeiro
net.ipv6 falso
net.unixDomainSocket.enabled verdadeiro
net.unixDomainSocket.pathPrefix /tmp
net.unixDomainSocket.filePermissions 0700
net.http.enabled falso
net.http.JSONPEnabled falso
net.http.RESTInterfaceEnabled falso
net.ssl.sslOnNormalPorts falso
net.ssl.mode desabilitado
net.ssl.PEMKeyFile nenhum
net.ssl.PEMKeyPassword nenhum
net.ssl.clusterFile nenhum
net.ssl.clusterSenha nenhum
net.ssl.CAFile nenhum
net.ssl.CRLFile nenhum
net.ssl.allowConnectionsWithoutCertificates falso
net.ssl.allowInvalidCertificates falso
net.ssl.allowInvalidHostnames falso
net.ssl.disabledProtocols nenhum
net.ssl.FIPSMode falso
Este comando irá despejar um arquivo bson gzipado de seu banco de dados mongod 'mydb' local para o diretório 'mydb.dump.
{timestamp}'
Este comando primeiro eliminará seu banco de dados 'mydb' atual e, em seguida, restaurará seu despejo bson gzipado do arquivo de despejo do arquivo
'mydb mydb.dump.2016-08-27_12:44/mydb'.
{ "_id" : "01001", "cidade" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "estado" :
"MA" }
{ "_id" : "01002", "cidade" : "CUSHMAN", "loc" : "estado" : [ -72.51564999999999, 42.377017 ], "pop" : 36963,
"MA" } { "_id" :
"01005", "cidade" : "BARRE", "loc" : "estado" : "MA" } [ -72.10835400000001, 42.409698 ], "pop" : 4546,
{ "_id" : "01007",
"cidade" : "BELCHERTOWN", "loc" : 10579, "estado" : "MA" } [ -72.41095300000001, 42.275103 ], "pop" :
{ "_id" : "01008 ", "cidade" :
"BLANDFORD", "local" : [ -72.936114, 42.182949 ], "pop" : 1240, "estado" :
"MA" }
{ "_id" : "01010", "cidade" : "BRIMFIELD", "loc" : [ -72.188455, 42.116543 ], "pop" : 3706, "estado" :
"MA" }
{ "_id" : "01011", "cidade" : "CHESTER", "loc" : [ -72.988761, 42.279421 ], "pop" : 1688, "estado" :
"E" }
para importar este conjunto de dados para o banco de dados denominado "teste" e a coleção denominada "zips"
C:\Users\yc03ak1>mongoimport --db test --collection "zips" --drop --type json --host "localhost:47019" --file "c:
\Users\yc03ak1\Desktop\zips.json"
--db : nome do banco de dados para o qual os dados serão importados --collection:
nome da coleção no banco de dados para o qual os dados serão importados --drop : descarta a coleção antes
padrão JSON --host : host mongodb e porta na qual os dados devem ser importados. --
saída :
para importar este conjunto de dados para o banco de dados denominado "teste" e a coleção denominada "amostra"
C:\Users\yc03ak1>mongoimport --db test --collection "sample" --drop --type csv --headerline --host "localhost:47019" --file "c:\Users\yc03ak1\Desktop\testing .csv"
--headerline: use a primeira linha do arquivo csv como os campos para o documento json
saída :
OU
C:\Users\yc03ak1>mongoimport --db test --collection "sample" --drop --type csv --fields _id,city,loc,pop,state --host "localhost:47019" --file
"c :\Users\yc03ak1\Desktop\testing.csv"
--fields : lista separada por vírgulas de campos que precisam ser importados no documento json. Saída:
Certifique-se de que a nova versão esteja sendo executada com mongo. O shell imprimirá a versão do servidor MongoDB que deve ser
3.4 agora.
Créditos
Muito obrigado a todas as pessoas da Stack Overflow Documentation que ajudaram a fornecer este conteúdo, mais
alterações podem ser enviadas para web@petercv.com para novos conteúdos a serem publicados ou atualizados
titogeo Capítulos 1, 8 e 9
Tomás Cañibano Capítulos 2 e 9
usuário641887 Capítulos 17 e 22
WAF Capítulo 1
amareloB capítulo 5
Zanon Capítulo 12