2013-03-11 11 views
5

Próbuję zaimportować ObjectOd Mongodb z pliku CSV za pomocą mongoimport:Jak zaimportować Mongodb ObjectId z pliku CSV za pomocą mongoimport?

Próbowałem każdej kombinacji i metody ewakuacji, o jakiej mogłem myśleć, ale nie mogę poprawnie importować ObjectId z CSV.

Najpierw próbowałem importować dokładnie to, co wyeksportowałem z MongoDB do CSV. Używam MongoDB 2.2.1.

Właśnie stworzyliśmy dwie kolekcje i odwołuje _id jednego dokumentu w innym dokumencie:

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"}) 

Następnie użyłem komendy mongoexport skorupek:

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

Wynikające CSV wygląda tak:

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

Następnie zaimportowałem wynikowy plik CSV, używając:

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

Quering klasa kolekcji powraca:

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

Jak można zauważyć pole student_id w drugim dokumencie faktycznie ciąg i nie MongoDB ObjectId.

Jestem w błędzie na coś lub Mongo nie może importować własnego eksportowanego pliku CSV?

+0

Czego oczekujesz i co się dzieje? Importujesz z powrotem do tej samej kolekcji w swoim przykładzie, co czyni ją niejasną. – JohnnyHK

+0

Próbuję zaimportować obiekt ObjectID MongoDB z csv i otrzymuję tylko ciągi importowane w MongoDB. Próbowałem importować eksport csv MongoDB, ale to nie spowodowało ObjectID. Wygląda na to, że nikt nie próbował zaimportować pola ObjectID z pliku CSV za pomocą mongoimport? – vladimirp

+0

To działało dobrze, gdy próbowałem tego. Czy twój aktualny plik test.csv ma ​​wiersz nagłówka zawierający nazwy pól? Twój przykładowy plik CSV tego nie pokazuje. – JohnnyHK

Odpowiedz

3

Problem można odtworzyć w MongoDB 2.4.1.

Dokumentacja (http://docs.mongodb.org/manual/reference/mongoimport/) państwa (podkreślenie przeze mnie):

Uwaga Nie używaj mongoimport i mongoexport pełną przykład kopii produkcyjnych, ponieważ nie będzie niezawodnie uchwycić typ danych informacji. Użyj mongodump i mongorestore, jak opisano w "Backupu dla systemów MongoDB" dla tego rodzaju funkcjonalności.

W tej dyskusji https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/RcnumM5QyxM podobne pytanie było jak to:

Mongoimport z TSV lub CSV mogą tylko łańcuchy i numery i import nie wszelkich innych typów określonych w [1 ]. Jeśli chcesz zaimportować te typy i możesz wygenerować JSON zamiast TSV dla swojego pliku importu , byłby to dobry sposób na wykonanie; w przeciwnym razie można napisać etap przetwarzania końcowego, który konwertuje ciągi znaków do odpowiednich typów MongoDB (na podstawie pewnej wiedzy na temat tego, jaki powinien być typ pola ).

  • Dan

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

+1

Więc nie jest to możliwe na końcu, tak jak myślałem. Dzięki za wyjaśnienie Ronasta. – vladimirp

+0

Instrukcje konwersji pliku CSV do zgodnego JSON w celu zachowania typów: http://stackoverflow.com/a/21298840/943833 – Roganartu

16

Dla każdego z tym problemem, który próbuje wstawić ObjectIds z JSON - to bardzo wiele jest możliwe przy odrobinie modyfikacji istniejących danych .

Wymienić:

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

Z:

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

Wystarczy użyć wyrażenia regularnego, aby zastąpić objectID okład.

+2

Najlepsza odpowiedź! Powinien być zielony! – bora89

Powiązane problemy