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.