Câu trả lời:
Vỏ cung cấp một số tính năng hay nhưng ẩn vì đó là một môi trường tương tác.
Khi bạn chạy các lệnh từ tệp javascript qua mongo command.js, bạn sẽ không nhận được hành vi hoàn toàn giống nhau.
Có hai cách để giải quyết vấn đề này.
(1) giả mạo và làm cho nó nghĩ rằng bạn đang ở chế độ tương tác
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
hoặc
(2) sử dụng Javascript để dịch kết quả của a find()
thành JSON có thể in được
mongo dbname command.js > output.json
nơi command.js chứa cái này (hoặc tương đương):
printjson( db.collection.find().toArray() )
Điều này sẽ in ra mảng kết quả, bao gồm [ ]
- nếu bạn không muốn, bạn có thể lặp qua mảng và printjson()
từng phần tử.
Nhân tiện, nếu bạn đang chạy chỉ một câu lệnh Javascript, bạn không phải đặt nó vào một tệp và thay vào đó bạn có thể sử dụng:
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
nhưng nó đã cho tôi JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Vì bạn đang thực hiện việc này trên một thiết bị đầu cuối và chỉ muốn kiểm tra bản ghi một cách lành mạnh, bạn có thể sử dụng một thủ thuật như sau:
mongo | tee somefile
Sử dụng phiên như bình thường - db.collection.find().pretty()
hoặc bất cứ điều gì bạn cần làm, bỏ qua đầu ra dài và thoát. Bản ghi phiên của bạn sẽ có trong tệptee
ghi vào.
Hãy lưu ý rằng đầu ra có thể chứa các chuỗi thoát và rác khác do trình bao mongo mong đợi một phiên tương tác. less
xử lý những điều này một cách duyên dáng.
Chỉ cần đặt các lệnh bạn muốn chạy vào một tệp, sau đó chuyển nó vào trình bao cùng với tên cơ sở dữ liệu và chuyển hướng đầu ra đến một tệp. Vì vậy, nếu lệnh find của bạn có trong find.js
và cơ sở dữ liệu của bạn foo
, nó sẽ giống như sau:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
Đã làm việc.
Đặt truy vấn của bạn (ví dụ db.someCollection.find().pretty()
) vào một tệp javascript, giả sử query.js
. Sau đó chạy nó trong trình bao hệ điều hành của bạn bằng lệnh:
mongo yourDb < query.js > outputFile
Kết quả truy vấn sẽ nằm trong tệp có tên 'outputFile'.
Theo mặc định, Mongo in ra 20 tài liệu IIRC đầu tiên. Nếu bạn muốn nhiều hơn, bạn có thể xác định giá trị mới cho kích thước hàng loạt trong Mongo shell, ví dụ:
DBQuery.shellBatchSize = 100
.
.js
tiện ích mở rộng. Bạn có thể viết tất cả các truy vấn shell mongo tuyệt vời đó mà không cần thay đổi chúng.
Sử dụng print
và JSON.stringify
bạn có thể chỉ cần tạo ra một kết quả hợp lệ JSON
.
Sử dụng --quiet
cờ để lọc nhiễu shell từ đầu ra.
Sử dụng --norc
cờ để tránh .mongorc.js
đánh giá. (Tôi phải làm điều đó vì một định dạng đẹp mà tôi sử dụng, tạo ra đầu ra JSON không hợp lệ ) Sử dụng DBQuery.shellBatchSize = ?
thay thế?
bằng giới hạn của kết quả thực tế để tránh phân trang.
Và cuối cùng, sử dụng tee
để chuyển đầu ra của thiết bị đầu cuối thành một tệp:
// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json
// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
print(JSON.stringify(data, null, 2));
}
toPrint(
db.getCollection('myCollection').find().toArray()
);
Hi vọng điêu nay co ich!
Sử dụng câu trả lời này từ Asya Kamsky, tôi đã viết một tập lệnh con dơi một dòng cho Windows. Dòng trông như thế này:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Sau đó, người ta có thể chạy nó:
exportToJson.bat DbName CollectionName
Ngoài ra còn có mongoexport cho điều đó, nhưng tôi không chắc nó có sẵn phiên bản nào.
Thí dụ:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
Như câu trả lời của Neodan mongoexport khá hữu ích với -q
tùy chọn cho truy vấn. Nó cũng chuyển đổi ObjectId
sang định dạng tiêu chuẩn của JSON "$oid"
. Ví dụ:
mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
bạn có thể sử dụng lệnh này để thực hiện nó:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json