IT story

MongoDB에서 컬렉션을 CSV로 내보내는 방법은 무엇입니까?

hot-time 2020. 9. 13. 11:49
반응형

MongoDB에서 컬렉션을 CSV로 내보내는 방법은 무엇입니까?


MongoDB 컬렉션의 모든 레코드를 .csv파일로 내보내는 방법은 무엇입니까?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

내 보내야하는 필드의 이름을 지정하라는 메시지가 표시됩니다. 필드 이름을 지정하지 않고 모든 필드를 내보낼 수 있습니까?


@ karoly-horvath가 맞습니다. CSV에는 입력란이 필요합니다.

MongoDB 문제 추적기 https://jira.mongodb.org/browse/SERVER-4224 의이 버그에 따르면 csv로 내보낼 때 필드를 제공해야합니다 . 문서가 명확하지 않습니다. 그것이 오류의 이유입니다.

이 시도:

mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName

최신 정보:

이 커밋 : https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 은 3.0.0-rc10 이상의 문서를 수정합니다. 바뀐다

Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`

Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`

버전 3.0 이상 :

더 이상 사용되지 않으므로 대신를 사용해야 ---type=csv합니다 --csv.

자세한 내용 : https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

전체 명령 :

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName

또한 쉼표로 구분 된 필드 이름 사이에 공백이 허용되지 않습니다.

나쁜: -f firstname, lastname

좋은: -f firstname,lastname


mongoexport  --help
....
-f [ --fields ] arg     comma separated list of field names e.g. -f name,age
--fieldFile arg         file with fields names - 1 per line

수동으로 지정해야하며 생각해 보면 완벽합니다. MongoDB는 스키마가 없습니다. 반면 CSV는 열 레이아웃이 고정되어 있습니다. 다른 문서에서 사용되는 필드를 알지 못하면 CSV 덤프를 출력 할 수 없습니다.

고정 된 스키마가있는 경우 하나의 문서를 검색하고 스크립트로 필드 이름을 수집하여 mongoexport에 전달할 수 있습니다.


원하는 경우 지정하지 않고 모든 컬렉션을 csv로 내보낼 수 있습니다 --fields(모든 필드를 내보냄).

에서 http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/은 이 bash는 스크립트를 실행

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=DBNAME
user=USERNAME
pass=PASSWORD
host=HOSTNAME:PORT

# first get all collections in the database
collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
collectionArray=($collections);

# for each collection
for ((i=0; i<${#collectionArray[@]}; ++i));
do
    echo 'exporting collection' ${collectionArray[$i]}
    # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
    keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
    # now use mongoexport with the set of keys to export the collection to csv
    mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
done

IFS=$OIFS;

mongoexport가 나를 위해 이것을 할 수 없었습니다. 모든 필드의 전체 목록을 얻으려면 전체 컬렉션을 한 번 반복해야합니다. 이것을 사용하여 헤더를 생성하십시오. 그런 다음 컬렉션을 다시 반복하여 각 문서에 대해 이러한 헤더를 채 웁니다.

이 작업을 수행하는 스크립트를 작성했습니다. 개별 문서 간의 스키마 차이에 관계없이 MongoDB 문서를 csv로 변환합니다.

https://github.com/surya-shodan/mongoexportcsv


또한 내부 json 필드를 내보내려면 점 (. 연산자)을 사용하십시오.

JSON 레코드 :

{
    "_id" : "00118685076F2C77",
    "value" : {
        "userIds" : [ 
            "u1"
        ],
        "deviceId" : "dev"
}

도트 연산자가있는 mongoexport 명령 (mongo 버전 3.4.7 사용) :

./mongoexport --host localhost --db myDB --collection myColl --type=csv --out out.csv --fields value.deviceId,value.userIds

Output csv:

value.deviceId,value.userIds
d1,"[""u1""]"
d2,"[""u2""]"

Note: Make sure you do not export an array. It would corrupt the CSV format like field userIds shown above


Below command used to export collection to CSV format.

Note: naag is database, employee1_json is a collection.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1

참고URL : https://stackoverflow.com/questions/6814151/how-to-export-collection-to-csv-in-mongodb

반응형