2013-03-11 18 views
5

Non riesco a importare l'ObjectId di Mongodb da un file CSV utilizzando mongoimport:Come importare ObjectDd Mongodb dal file CSV usando mongoimport?

Ho provato tutte le combinazioni e il metodo di escape che potevo pensare ma non posso importare ObjectId correttamente da CSV.

Per prima cosa ho provato a importare esattamente ciò che viene esportato da MongoDB a CSV. Sto usando MongoDB 2.2.1.

Ho appena creato due collezioni e referenziata _id un documento in un altro documento:

use yourdb 
db.createCollection("student") 
db.createCollection("class") 
db.student.insert({"name":"Peter"}) 
db.student.find() returns { "_id" : ObjectId("5143af326d44e1ceb372121d"), "name" : "Peter" } 
db.class.insert({"student_id": ObjectId("5143af326d44e1ceb372121d"),"name":"II-4"}) 

Poi ho usato mongoexport comando nella shell:

mongoexport -h localhost:3002 -d yourdb -c classes --csv -f student_id,name > export.txt 

risultante CSV si presenta così:

student_id,name 
ObjectID(5143af326d44e1ceb372121d),"II-4" 

Quindi ho importato il CSV risultante utilizzando:

mongoimport -h localhost:3002 -d yourdb -c class --type csv --file export.txt --headerline 

quering classe raccolta ora ritorna:

db.class.find() 
{ "_id" : ObjectId("5143afc66d44e1ceb372121e"), "student_id" : ObjectId("5143af326d44e1ceb372121d"), "name" : "II-4" } 
{ "_id" : ObjectId("5143b44788df173ba096550e"), "student_id" : "ObjectID(5143af326d44e1ceb372121d)", "name" : "II-4" } 

Come si può notare campo student_id nel secondo documento è in realtà una stringa e non MongoDB ObjectId.

Mi sbaglio su qualcosa o Mongo non può importare il proprio CSV esportato ??

+0

Cosa ti aspetti che succeda e cosa sta succedendo invece? Stai importando di nuovo nella stessa collezione nel tuo esempio che non è chiaro. – JohnnyHK

+0

Sto cercando di importare ObjectID di MongoDB da csv e sto ottenendo solo le stringhe importate in MongoDB. Ho provato a importare l'esportazione csv di MongoDB ma questo non ha portato ad ObjectIDs. Sembra che nessuno abbia provato a importare il campo ObjectID da un file CSV usando mongoimport? – vladimirp

+0

Ha funzionato bene quando ho provato questo. Il tuo vero file test.csv ha una riga di intestazione che contiene i nomi dei campi? Il tuo esempio CSV non lo mostra. – JohnnyHK

risposta

3

Il problema può essere riprodotto in MongoDB 2.4.1.

La documentazione (http://docs.mongodb.org/manual/reference/mongoimport/) stati (enfasi da me):

Nota Non utilizzare mongoimport e mongoexport per la piena esempio, backup di produzione perché non acquisire in modo affidabile il tipo di dati informazioni. Utilizzare mongodump e mongorestore come descritto in "Backup Strategie per sistemi MongoDB" per questo tipo di funzionalità.

In questa discussione https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/RcnumM5QyxM una domanda simile è stato risposto come questo:

Mongoimport con TSV o CSV possono solo stringhe di importazione e numeri, e non qualsiasi degli altri tipi specificati in [1 ]. Se si desidera importare i tipi e se è possibile produrre JSON anziché TSV per il proprio file di importazione , sarebbe un buon modo per procedere; in caso contrario, è possibile scrivere una fase di post-elaborazione che converte le stringhe nei tipi appropriati MongoDB (in base alla conoscenza di quale dovrebbe essere il tipo di valore per un campo dato ).

  • Dan

[1] http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON

+1

Quindi alla fine non è possibile pensavo che lo fosse. Grazie per la spiegazione Ronasta. – vladimirp

+0

Istruzioni su come convertire il file CSV in JSON compatibile per preservare i tipi: http://stackoverflow.com/a/21298840/943833 – Roganartu

16

Per chiunque con questo problema che sta cercando di inserire objectIds da JSON - è molto è possibile con un po 'di modifiche ai dati esistenti .

Sostituire:

{ "_id" : ObjectId("5143afc66d44e1ceb372121e"), 
    "student_id" : ObjectId("5143af326d44e1ceb372121d"), 
    "name" : "II-4" } 

Con:

{ "_id" : {"$oid":"5143afc66d44e1ceb372121e"}, 
    "student_id" : {"$oid":"5143af326d44e1ceb372121d"}, 
    "name" : "II-4" } 

Basta usare un'espressione regolare per sostituire l'involucro ObjectId.

+2

Risposta migliore! Dovrebbe essere verde! – bora89

Problemi correlati