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.