MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Le modalità di importazione di mongoimport

Quando si utilizza mongoimport per importare file in MongoDB, hai la possibilità di specificare una modalità da utilizzare. Queste modalità determinano cosa succede se nella raccolta sono già presenti documenti corrispondenti in cui stai tentando di importare.

Per impostazione predefinita, mongoimport utilizza insert modalità, ma ci sono altre modalità che puoi usare. La modalità che utilizzi dipenderà da ciò che stai cercando di fare.

Di seguito è riportata una panoramica di ciascuna modalità insieme ad esempi.

Le modalità

Le modalità di importazione disponibili in mongoimport sono i seguenti:

Modalità Descrizione
insert Questa è la modalità predefinita. Questa modalità inserisce i documenti dal file di importazione. Se esiste già un documento corrispondente nella raccolta, si verifica un errore. Un documento corrispondente è uno che ha lo stesso ID univoco (come un _id corrispondente campo) come documento nel file di importazione.
upsert Sostituisce i documenti esistenti nel database con i documenti corrispondenti dal file di importazione. Tutti gli altri documenti vengono inseriti.
merge Unisce i documenti esistenti che corrispondono a un documento nel file di importazione con il nuovo documento. Tutti gli altri documenti vengono inseriti.
delete Elimina i documenti esistenti nel database che corrispondono a un documento nel file di importazione. Eventuali documenti non corrispondenti non hanno effetto.

Di seguito sono riportati esempi di come funziona ciascuna modalità.

Modalità inserimento

Supponiamo di avere una collezione chiamata pets con i seguenti documenti:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

A quanto pare, quelli sono stati importati in un file chiamato pets.json .

Ora immagina di avere un altro file JSON chiamato pets2.json , che contiene i seguenti documenti 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 }

Ecco cosa succede se proviamo a importarlo nei nostri pets raccolta durante l'utilizzo (impostazione predefinita) insert modalità.

mongoimport --db=PetHotel --collection=pets --file=pets2.json

Uscita:

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.

Secondo tale messaggio di errore, solo uno dei quattro documenti è stato importato. Gli altri tre hanno causato un errore a causa della presenza di una chiave duplicata nel _id campo.

Ora diamo un'occhiata alla collezione.

db.pets.find()

Risultato:

{ "_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 }

Quindi possiamo vedere che l'ultimo documento è stato inserito. Questo è previsto, perché in precedenza non avevamo un documento con un _id valore di 4 .

Modalità rialzo

Ecco cosa succede se utilizziamo upsert modalità per inserire lo stesso documento.

mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json

Uscita:

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.

L'output ci dice che 3 dei 4 documenti sono stati importati correttamente e che non si sono verificati errori.

Controlliamo la collezione.

db.pets.find()

Risultato:

{ "_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 }

Possiamo vedere che i primi tre documenti sono stati sostituiti con i documenti del file di importazione. Il quarto documento rimane lo stesso che era dopo l'importazione precedente.

Nota che il primo documento ha perso il suo name e type campi. Questo perché il upsert la modalità sostituisce l'intero documento e il nostro documento sostitutivo ha solo il weight campo (così come il _id campo).

Modalità unione

Modifichiamo il nostro pets2.json file in modo che assomigli a questo:

{ "_id" : 1, "name": "Wag", "type": "Dog" }
{ "_id" : 2, "name" : "Fetch" }
{ "_id" : 3, "name" : "Scratch" }
{ "_id" : 4, "name" : "Bubbles" }
{ "_id" : 5, "name" : "Hop", "type": "Kangaroo" }

Ora eseguiamo mongoimport comando di nuovo, ma questa volta in merge modalità:

mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json

Uscita:

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.

In base all'output, sono stati importati 3 documenti.

Diamo un'occhiata alla collezione.

db.pets.find()

Risultato:

{ "_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" }

Possiamo vedere che i documenti 1 e 2 sono stati aggiornati ed è stato inserito il documento 5. Per quanto riguarda il documento 1, il weight campo è rimasto anche se il documento di importazione non includeva quel campo. Questo perché abbiamo usato merge modalità. Se avessimo usato upsert modalità (come nell'esempio precedente), il weight campo sarebbe scomparso.

Modalità di eliminazione

Quando usi delete modalità, tutti i documenti corrispondenti vengono semplicemente eliminati. I documenti non corrispondenti rimangono nella collezione.

Quindi vediamo cosa succede quando importiamo lo stesso documento, ma questa volta passiamo a delete modalità.

mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json

Risultato:

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.

Tutti i 5 documenti della raccolta sono stati eliminati.

Cambiare il/i campo/i Upsert

Puoi usare il --upsertFields parametro per specificare un campo diverso da _id contro cui confrontarsi. Quando si utilizza questo parametro, passare i campi come un elenco separato da virgole.

Non sono sicuro di avere mongoimport ?

mongoimport fa parte del pacchetto MongoDB Database Tools. I MongoDB Database Tools sono una suite di utilità da riga di comando per lavorare con MongoDB.

Se non sei sicuro di avere MongoDB Database Tools/mongoimport installato, prova a eseguire il seguente comando nel terminale o nel prompt dei comandi per verificare:

mongoimport --version

Se ce l'hai, dovresti vedere le informazioni sulla versione, ecc. Se non ce l'hai, puoi usare le istruzioni di installazione sul sito Web di MongoDB per installarlo sul tuo sistema.

Dove eseguire mongoimport Comandi?

Devi eseguire mongoimport comandi dalla riga di comando del sistema (ad es. una nuova finestra del terminale o del prompt dei comandi).

Non eseguirli da mongo guscio.