MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Os modos de importação do mongoimport


Ao usar mongoimport para importar arquivos para o MongoDB, você tem a opção de especificar um modo a ser usado. Esses modos determinam o que acontece se já houver documentos correspondentes na coleção para a qual você está tentando importar.

Por padrão, mongoimport usa insert modo, mas existem outros modos que você pode usar. O modo que você usa dependerá do que você está tentando fazer.

Abaixo está uma visão geral de cada modo, juntamente com exemplos.

Os modos


Os modos de importação disponíveis em mongoimport são como segue:
Modo Descrição
insert Este é o modo padrão. Este modo insere os documentos do arquivo de importação. Se já existir um documento correspondente na coleção, ocorrerá um erro. Um documento correspondente é aquele que tem o mesmo ID exclusivo (como um _id correspondente field) como um documento no arquivo de importação.
upsert Substitui os documentos existentes no banco de dados pelos documentos correspondentes do arquivo de importação. Todos os outros documentos são inseridos.
merge Mescla documentos existentes que correspondem a um documento no arquivo de importação com o novo documento. Todos os outros documentos são inseridos.
delete Exclui documentos existentes no banco de dados que correspondem a um documento no arquivo de importação. Quaisquer documentos não correspondentes não têm efeito.

Exemplos de como cada modo funciona estão abaixo.

Modo de inserção


Suponha que tenhamos uma coleção chamada pets com os seguintes documentos:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Acontece que eles foram importados em um arquivo chamado pets.json .

Agora imagine que temos outro arquivo JSON chamado pets2.json , que contém os seguintes documentos JSON:
{ "_id" : 1, "weight": 40 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight": 10 }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight": 5 }
{ "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight": 3 }

Veja o que acontece se tentarmos importar isso para nossos pets coleção ao usar (o padrão) insert modo.
mongoimport --db=PetHotel --collection=pets --file=pets2.json

Saída:
2021-01-03T10:07:23.421+1000	connected to: mongodb://localhost/
2021-01-03T10:07:23.422+1000	continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 1 }
2021-01-03T10:07:23.422+1000	continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 2 }
2021-01-03T10:07:23.422+1000	continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 3 }
2021-01-03T10:07:23.423+1000	1 document(s) imported successfully. 3 document(s) failed to import.

De acordo com essa mensagem de erro, apenas um dos quatro documentos foi importado. Os outros três causaram um erro devido a uma chave duplicada no _id campo.

Agora vamos ver a coleção.
db.pets.find()

Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }

Assim, podemos ver que o último documento foi inserido. Isso é esperado porque não tínhamos anteriormente um documento com um _id valor de 4 .

Modo Upsert


Veja o que acontece se usarmos upsert modo para inserir o mesmo documento.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json

Saída:
2021-01-03T10:19:55.400+1000	connected to: mongodb://localhost/
2021-01-03T10:19:55.444+1000	3 document(s) imported successfully. 0 document(s) failed to import.

A saída nos informa que 3 dos 4 documentos foram importados com sucesso e que não houve falhas.

Vamos conferir a coleção.
db.pets.find()

Resultado:
{ "_id" : 1, "weight" : 40 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight" : 5 }
{ "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }

Podemos ver que os três primeiros documentos foram substituídos pelos documentos do arquivo de importação. O quarto documento permanece o mesmo que era após a importação anterior.

Observe que o primeiro documento perdeu seu name e type Campos. Isso ocorre porque o upsert O modo substitui todo o documento, e nosso documento de substituição tem apenas o weight campo (assim como o _id campo).

Modo de mesclagem


Vamos modificar nosso pets2.json arquivo para que fique assim:
{ "_id" : 1, "name": "Wag", "type": "Dog" }
{ "_id" : 2, "name" : "Fetch" }
{ "_id" : 3, "name" : "Scratch" }
{ "_id" : 4, "name" : "Bubbles" }
{ "_id" : 5, "name" : "Hop", "type": "Kangaroo" }

Agora vamos executar o mongoimport comando novamente, mas desta vez em merge modo:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json

Saída:
2021-01-03T10:32:33.596+1000	connected to: mongodb://localhost/
2021-01-03T10:32:33.607+1000	3 document(s) imported successfully. 0 document(s) failed to import.

De acordo com a saída, 3 documentos foram importados.

Vamos dar uma olhada na coleção.
db.pets.find()

Resultado:
{ "_id" : 1, "weight" : 40, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Fetch", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight" : 5 }
{ "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }
{ "_id" : 5, "name" : "Hop", "type" : "Kangaroo" }

Podemos ver que os documentos 1 e 2 foram atualizados e o documento 5 foi inserido. Em relação ao documento 1, o weight campo permaneceu mesmo que o documento de importação não incluísse esse campo. Isso ocorre porque usamos merge modo. Se tivéssemos usado upsert modo (como no exemplo anterior), o weight campo teria desaparecido.

Modo de exclusão


Quando você usa delete modo, quaisquer documentos correspondentes são simplesmente excluídos. Documentos não correspondentes permanecem na coleção.

Vamos ver o que acontece quando importamos o mesmo documento, mas desta vez vamos para delete modo.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json

Resultado:
2021-01-03T10:39:38.925+1000	connected to: mongodb://localhost/
2021-01-03T10:39:38.926+1000	5 document(s) deleted successfully. 0 document(s) failed to delete.

Todos os 5 documentos da coleção foram excluídos.

Alterando o(s) campo(s) Upsert


Você pode usar o --upsertFields parâmetro para especificar um campo diferente de _id para enfrentar. Ao usar este parâmetro, passe os campos como uma lista separada por vírgulas.

Não tenho certeza se você tem mongoimport ?


mongoimport faz parte do pacote MongoDB Database Tools. As ferramentas de banco de dados do MongoDB são um conjunto de utilitários de linha de comando para trabalhar com o MongoDB.

Se você não tem certeza se possui o MongoDB Database Tools/mongoimport instalado, tente executar o seguinte comando no seu Terminal ou Prompt de Comando para verificar:
mongoimport --version

Se você o tiver, deverá ver as informações da versão, etc. Se não o tiver, poderá usar as instruções de instalação no site do MongoDB para instalá-lo em seu sistema.

Onde executar mongoimport Comandos?


Você precisa executar mongoimport comandos da linha de comando do seu sistema (por exemplo, um novo Terminal ou janela de prompt de comando).

Não os execute a partir do mongo Concha.