Làm cách nào để xuất bộ sưu tập sang CSV trong MongoDB?


100

Làm cách nào để xuất tất cả các bản ghi trong bộ sưu tập MongoDB sang một .csvtệp?

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

Điều này yêu cầu tôi chỉ định tên của các trường tôi cần xuất. Tôi có thể chỉ xuất tất cả các trường mà không chỉ định tên các trường không?

Câu trả lời:


114

@ karoly-horvath nói đúng. Các trường là bắt buộc cho csv.

Theo lỗi này trong trình theo dõi vấn đề MongoDB https://jira.mongodb.org/browse/SERVER-4224, bạn PHẢI cung cấp các trường khi xuất sang csv . Các tài liệu không rõ ràng về nó. Đó là lý do của lỗi.

Thử cái này:

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

CẬP NHẬT:

Cam kết này: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 sửa lỗi tài liệu cho 3.0.0-rc10 trở lên. Nó thay đổi

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

đến

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

PHIÊN BẢN 3.0 VÀ TRÊN:

Bạn nên sử dụng --type=csvthay --csvvì nó đã không được dùng nữa.

Thêm chi tiết: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Lệnh đầy đủ:

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

16
Tính đến phiên bản 3.0.6 mongoexportnóicsv flag is deprecated; please use --type=csv instead
La Mã Dibikhin

Cảm ơn (xin ẩn danh) về bản chỉnh sửa PHIÊN BẢN 3.0 VÀ TRÊN.
campeterson 23/09/18

4
có cách nào nhanh chóng để bao gồm tất cả các trường thay vì đặt tên cho từng trường không?
Kevz

53

Ngoài ra, bạn không được phép có khoảng trắng giữa các tên trường được phân tách bằng dấu phẩy.

XẤU: -f firstname, lastname

TỐT: -f firstname,lastname


28
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

Bạn phải chỉ định nó theo cách thủ công và nếu bạn nghĩ về nó, nó hoàn toàn hợp lý. MongoDB là không có schemaless; Mặt khác, CSV có bố cục cố định cho các cột. Nếu không biết trường nào được sử dụng trong các tài liệu khác nhau thì không thể xuất tệp CSV.

Nếu bạn có một lược đồ cố định, có lẽ bạn có thể truy xuất một tài liệu, thu thập các tên trường từ nó bằng một tập lệnh và chuyển nó đến mongoexport.


1
Tôi chỉ đang tìm kiếm xem tôi có thể lấy danh sách các trường từ bản ghi hay không. tức là từ db.collection.finOne (). getFields (). Nhưng tôi đoán đó không phải là phương pháp phù hợp (getFields). Tôi cũng đã thử getKeys (). Nếu không, tôi sẽ phải lấy bản ghi có hàm băm key: value.
Thành công Stha

Tôi đang cố gắng làm điều tương tự, nhưng để tìm ra lý do tại sao nó không nhập tệp csv đúng cách. Trong trường hợp của tôi, tôi cần nó cho tôi biết mọi thứ về chính nó, bao gồm cả những lĩnh vực mà nó tự “phát minh ra”. Vì vậy, trong trường hợp của tôi, không có ý nghĩa hoàn hảo khi phải chỉ định các trường, bởi vì tôi không biết tất cả chúng là gì!
Stephen

Trên mặt trận kịch bản thu hoạch hiện trường, tôi đã đăng bài này một năm hoặc lâu hơn, có thể cho bạn một vài ý tưởng.
arober 11

9

Nếu muốn, bạn có thể xuất tất cả các bộ sưu tập sang csv mà không cần chỉ định --fields(sẽ xuất tất cả các trường).

Từ http://drzon.net/export-mongodb-collections-to-csv-without-specify-fields/ chạy tập lệnh bash này

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;

4
Chỉ có một vấn đề với tập lệnh trên là nó giả định rằng tài liệu đầu tiên trong mỗi bộ sưu tập chứa tất cả các khóa có thể xuất hiện trong một tài liệu trong bộ sưu tập đó; điều này có thể không đúng nếu loại tài liệu có thể chứa một mảng hoặc tài liệu con lồng nhau.
arober 11

@ arober11 bạn nói đúng, quên đề cập đến sự thật quan trọng này. Những gì tôi thường làm, là chạy một tập lệnh thu gọn bản đồ để thu thập tất cả các khóa theo định kỳ và sử dụng nó để kéo tất cả các chìa khóa
Michael

3

Tôi không thể yêu cầu mongoexport thực hiện việc này cho tôi. Tôi thấy rằng, để có được danh sách đầy đủ tất cả các trường, bạn cần phải lặp lại toàn bộ bộ sưu tập một lần. Sử dụng điều này để tạo tiêu đề. Sau đó lặp lại bộ sưu tập để điền các tiêu đề này cho mỗi tài liệu.

Tôi đã viết một kịch bản để làm điều này. Chuyển đổi tài liệu MongoDB thành csv bất kể sự khác biệt về lược đồ giữa các tài liệu riêng lẻ.

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


2

Ngoài ra, nếu bạn muốn xuất các trường json bên trong, hãy sử dụng toán tử dot (.).

Bản ghi JSON:

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

lệnh mongoexport với toán tử dot (sử dụng mongo phiên bản 3.4.7):

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

Xuất csv:

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

Lưu ý: Đảm bảo rằng bạn không xuất một mảng. Nó sẽ làm hỏng định dạng CSV như trường userIds được hiển thị ở trên


0

Giải pháp cho người dùng MongoDB Atlas!

Thêm --fieldstham số dưới dạng các tên trường được phân tách bằng dấu phẩy trong dấu ngoặc kép đảo ngược:

--fields "<FIELD 1>,<FIELD 2>..."

Đây là ví dụ hoàn chỉnh:

mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."

0

Điều này làm việc cho tôi Hãy thử nó

mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword

Trên cmd trả về toàn bộ dữ liệu của bộ sưu tập người dùng nếu bạn muốn trường lọc thì thêm --fields = email, tên


Điều này khác với các câu trả lời dưới đây như thế nào?
Daniel W.

mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / Documents / db-12-2020 --authenticationDatabase admin --ssl --username youruname - mật khẩu mật khẩu của bạn, bạn có thể thử điều này cũng cung cấp cho bạn toàn bộ bộ sưu tập.
manoj patel

0

hoạt động để tôi chuyển sang vùng chứa docker với mongo: 4.2.6

mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv

-1

Đối với tất cả những người bị mắc kẹt với một lỗi.

Hãy để tôi cung cấp cho các bạn một giải pháp với một lời giải thích ngắn gọn tương tự: -

lệnh kết nối: -

mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin

--host -> máy chủ của máy chủ Mongo

--port -> cổng của máy chủ Mongo

-u -> tên người dùng

-p -> mật khẩu

--db -> db mà bạn muốn xuất

- bộ sưu tập -> bộ sưu tập bạn muốn xuất

--type -> loại xuất trong trường hợp của tôi là CSV

--out -> tên tệp nơi bạn muốn xuất

--fields -> tất cả các trường bạn muốn xuất (không đặt dấu cách giữa hai tên trường ở giữa dấu phẩy trong trường hợp CSV)

--authenticationDatabase -> cơ sở dữ liệu nơi lưu trữ tất cả thông tin người dùng của bạn


-2

Lệnh dưới đây được sử dụng để xuất bộ sưu tập sang định dạng CSV.

Lưu ý: naaglà cơ sở dữ liệu, employee1_jsonlà một tập hợp.

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

đây là những gì mongodb 4 trả về: Không thành công: Chế độ CSV yêu cầu danh sách trường
THỨ SÁU
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.