Cách xuất JSON từ MongoDB bằng Robomongo


108

Vì vậy, tôi không biết nhiều về MongoDB. Tôi đã RoboMongosử dụng mà tôi kết nối với MongoDB. Điều tôi cần làm là đây - có một bộ sưu tập trong MongoDB đó. Tôi muốn xuất dữ liệu từ bộ sưu tập đó để có thể lưu vào tệp.

Tôi đã sử dụng giao diện để mở dữ liệu từ bộ sưu tập dưới dạng văn bản và thực hiện dấu Ctrl+ Avà dán vào tệp văn bản. Tuy nhiên, tôi thấy rằng không phải tất cả dữ liệu đều được sao chép và cũng có nhiều nhận xét trong dữ liệu văn bản khiến JSON tự nhiên phá vỡ.

Tôi đang băn khoăn không biết RoboMongo có Export As JSONcơ sở nào để tôi có thể thực hiện xuất khẩu sạch không.

Bất kỳ con trỏ được đánh giá cao!


Bạn muốn xuất các bộ sưu tập cụ thể hoặc db đầy đủ?
Ramesh Murugesan

1
Đây không phải là một tính năng hiện tại của Robomongo, nhưng tôi đã thêm một đề xuất tính năng trong hàng đợi vấn đề github: Thêm xuất JSON . Có một gợi ý chung rằng nhập / xuất nên được tích hợp , nhưng các trường hợp sử dụng thực tế / chi tiết hơn sẽ rất hữu ích. Ví dụ: điều này có nên hỗ trợ xuất JSON từ một bộ sưu tập, một truy vấn tìm kiếm, một đường dẫn tổng hợp không? Hiện tại, lựa chọn tốt nhất của bạn là sử dụng mongoexportcông cụ dòng lệnh tiêu chuẩn .
Stennie

1
@Stennie - cảm ơn bạn đã bình luận. Tôi đoán trong câu trả lời cho câu hỏi của bạn - từ quan điểm trải nghiệm khách hàng, điều đó không thực sự quan trọng. Trong hầu hết các giao diện DB khác, quy trình là bạn chạy một truy vấn (có hoặc không có tiêu chí), nhận một tập hợp các kết quả. Nhấp chuột phải và nói "xuất kết quả dưới dạng ..." Vì vậy, điều tương tự cũng sẽ được áp dụng ở đây. Không thành vấn đề nếu tôi đang xuất toàn bộ bộ sưu tập hay một truy vấn tìm. Nếu kết quả có thể được hiển thị trong bảng điều khiển, thì nó sẽ có thể xuất được.
Biến không xác định

1
Đơn giản bạn có thể làm điều nàymongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Naren

Câu trả lời:


63

Bạn có thể sử dụng tojsonđể chuyển đổi từng bản ghi thành JSON trong tập lệnh shell MongoDB .

Chạy tập lệnh này trong RoboMongo:

var cursor = db.getCollection('foo').find({}, {});
while(cursor.hasNext()) {
    print(tojson(cursor.next()))
}

Điều này in tất cả kết quả dưới dạng một mảng giống JSON.

Kết quả không thực sự là JSON! Một số loại, chẳng hạn như ngày và ID đối tượng, được in như JavaScript cuộc gọi chức năng, ví dụ ISODate("2016-03-03T12:15:49.996Z").

Có thể không hiệu quả lắm đối với các tập kết quả lớn, nhưng bạn có thể giới hạn truy vấn. Ngoài ra, bạn có thể sử dụng mongoexport.


3
Nó xuất ra json không hợp lệ.
Từng

Đối với nhiều trường hợp sử dụng, người ta có thể sử dụng tojson(db.getCollection(...).find(...)["_batch"])để xuất toàn bộ lô hiện tại thu được từ máy chủ.
Yuval

@Yuval Ý của bạn là theo nghĩa đen ["_batch"]? Bạn có thể cho một ví dụ làm thế nào để sử dụng điều này? Tôi đã thử điều này với Robo 3T 1.2.1, nhưng nó chỉ thông báo "Tập lệnh được thực thi thành công, nhưng không có kết quả nào để hiển thị".
Florian Winter

7
@FlorianWinter Đó chỉ là từ những phát hiện ngẫu nhiên từ việc mày mò. Một giải pháp tốt hơn là tojson(db.getCollection(...).find(...).toArray()).
Yuval,

@Yuval Đẹp! Đó là giải pháp dễ nhất sau đó, tốt hơn nhiều so với giải pháp của tôi. Hãy xem xét đăng nó như một câu trả lời. (Hoặc chỉnh sửa của tôi, nhưng sau đó tôi sẽ nhận được tất cả tín dụng mà bạn xứng đáng, điều này sẽ hơi không công bằng ...)
Florian Winter

58

Một cách nhanh chóng và dễ dàng: Chỉ cần viết truy vấn của bạn db.getCollection('collection').find({}).toArray()và nhấp chuột phải Copy JSON. Dán dữ liệu vào trình chỉnh sửa mà bạn chọn.

nhập mô tả hình ảnh ở đây


4
Khéo léo! Không bẩn chút nào vì thiếu chức năng xuất trong robo3t. Dễ dàng hơn nhiều đối với các tập hợp dữ liệu nhỏ so với các giải pháp được đề xuất khác.
Ilya Luzyanin

30

Chức năng shell của Robomongo sẽ giải quyết vấn đề. Trong trường hợp của tôi, tôi cần một vài cột làm định dạng CSV.

var cursor = db.getCollection('Member_details').find({Category: 'CUST'},{CustomerId :1,Name :1,_id:0})

while (cursor.hasNext()) {
    var record = cursor.next();   
    print(record.CustomerID + "," + record.Name)
}

Output : -------

334, Harison
433, Rechard
453, Michel
533, Pal

1
Có thể viết đầu ra của tập lệnh này vào một trình bao csv cục bộ whithin Robomongo không?
xxxvincxxx

Điều này cho phép tôi "Script thực hiện thành công, nhưng không có kết quả để hiển thị"
Shanika Ediriweera

Lỗi: Dòng 10: Invalid trái tay bên trong phân
Eugen Sunic

19

Có một vài MongoDB GUI ngoài kia, một số trong số chúng có hỗ trợ xuất dữ liệu. Bạn sẽ tìm thấy danh sách đầy đủ các GUI của MongoDB tại http://mongodb-tools.com

Bạn đã hỏi về việc xuất kết quả truy vấn của mình chứ không phải về việc xuất toàn bộ bộ sưu tập. Hãy dùng thử 3T MongoChef MongoDB GUI , công cụ này có hỗ trợ cho trường hợp sử dụng cụ thể của bạn.


Studio 3T đã hoàn thành công việc dễ dàng hơn mong đợi! : +1:
vinyll

16

bạn nói "xuất thành tệp" như trong bảng tính? thích một .csv?

IMO đây là cách DỄ DÀNG NHẤT để thực hiện việc này trong Robo 3T (trước đây là robomongo):

  1. Ở trên cùng bên phải của Robo 3T GUI có nút "Xem kết quả ở chế độ văn bản", nhấp vào đó và sao chép mọi thứ

  2. dán mọi thứ vào trang web này: https://json-csv.com/

  3. nhấp vào nút tải xuống và bây giờ bạn có nó trong một bảng tính.

hy vọng điều này sẽ giúp ai đó, như tôi ước Robo 3T có khả năng xuất khẩu


Rất đơn giản, cảm ơn bạn
Tính Ngô Quang

11

Không chạy lệnh này trên shell, hãy nhập tập lệnh này tại dấu nhắc lệnh với tên cơ sở dữ liệu, tên bộ sưu tập và tên tệp của bạn, tất cả đều thay thế trình giữ chỗ ..

mongoexport --db (Database name) --collection (Collection Name) --out (File name).json

Nó làm việc cho tôi.



5

Mở rộng câu trả lời của Anish, tôi muốn một cái gì đó tôi có thể áp dụng cho bất kỳ truy vấn nào để tự động xuất ra tất cả các trường so với việc phải xác định chúng trong câu lệnh in. Nó có thể được đơn giản hóa nhưng đây là một cái gì đó nhanh và bẩn hoạt động tuyệt vời:

var cursor = db.getCollection('foo').find({}, {bar: 1, baz: 1, created_at: 1, updated_at: 1}).sort({created_at: -1, updated_at: -1});

while (cursor.hasNext()) {
    var record = cursor.next();
    var output = "";
    for (var i in record) {
      output += record[i] + ",";
    };
    output = output.substring(0, output.length - 1);
    print(output);
}

4

Nếu bạn muốn sử dụng mongoimport , bạn sẽ muốn xuất theo cách này:

db.getCollection('tables')
  .find({_id: 'q3hrnnoKu2mnCL7kE'})
  .forEach(function(x){printjsononeline(x)});

2

Sử dụng kịch bản shell robomongo:

//on the same db
var cursor = db.collectionname.find();

while (cursor.hasNext()) {
    var record = cursor.next();   
    db.new_collectionname.save(record);
}

Sử dụng lệnh xuất và nhập của mongodb

Bạn có thể thêm --jsonArraytham số / cờ vào mongoexportlệnh của mình , điều này xuất kết quả dưới dạng mảng json đơn.

Sau đó, chỉ cần chỉ định lại --jsonArraycờ khi nhập.

Hoặc xóa dấu ngoặc mảng bắt đầu và kết thúc [] trong tệp, sau đó tệp đã sửa đổi và xuất của bạn sẽ nhập bằng mongoimportlệnh mà không có --jsonArraycờ.

Thông tin thêm về Xuất tại đây: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Nhập tại đây: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

Tôi cũng gặp phải vấn đề này và tập lệnh chạy trong robomongo (Robo 3T 1.1.1) cũng không cho phép sao chép các giá trị và cũng không có tùy chọn xuất. Cách tốt nhất tôi có thể đạt được điều này là sử dụng mongoexport, nếu mongodb được cài đặt trên cục bộ của bạn, bạn có thể sử dụng mongoexport để kết nối với cơ sở dữ liệu trên bất kỳ máy chủ nào và trích xuất dữ liệu

Để kết nối với Dữ liệu trên máy chủ từ xa và tệp đầu ra csv, hãy chạy mongoexport sau trong dòng lệnh của bạn

mongoexport --host HOSTNAME --port PORT --username USERNAME --password "PASSWORD" --collection COLLECTION_NAME --db DATABASE_NAME --out OUTPUTFILE.csv --type=csv --fieldFile fields.txt

fieldFile: giúp trích xuất các cột mong muốn, ví dụ: nội dung của fields.txt có thể chỉ là:

tên người dùng

để chỉ trích xuất các giá trị của cột 'userId'

Dữ liệu trên máy chủ từ xa, tệp đầu ra json:

mongoexport --host HOST_NAME --port PORT --username USERNAME --password "PASSWORD" --collection COLECTION_NAME --db DATABASE_NAME --out OUTPUT.json

điều này trích xuất tất cả các trường vào tệp json

dữ liệu trên localhost (mongodb phải chạy trên localhost)

mongoexport --db DATABASE_NAME --collection COLLECTION --out OUTPUT.json

Tham khảo: https://docs.mongodb.com/manual/reference/program/mongoexport/#use


1

Giải pháp:

mongoexport --db test --collection traffic --out traffic.json<br><br>

nhập mô tả hình ảnh ở đây

Trong đó:
cơ sở dữ liệu ->
tên bộ sưu tập máy chủ giả lập ->
tên tệp đầu ra api_defs -> childChoreRequest.json


1

Một phần mở rộng cho câu trả lời Florian Winter dành cho những người muốn tạo sẵn sàng thực thi truy vấn.

dropinsertManytruy vấn bằng cách sử dụng cursor:

{
    // collection name
    var collection_name = 'foo';

    // query
    var cursor = db.getCollection(collection_name).find({});

    // drop collection and insert script
    print('db.' + collection_name + '.drop();');
    print('db.' + collection_name + '.insertMany([');

    // print documents
    while(cursor.hasNext()) {
        print(tojson(cursor.next()));

        if (cursor.hasNext()) // add trailing "," if not last item
            print(',');
    }

    // end script
    print(']);');
}

Đầu ra của nó sẽ như sau:

db.foo.drop();
db.foo.insertMany([
{
    "_id" : ObjectId("abc"),
    "name" : "foo"
}
,
{
    "_id" : ObjectId("xyz"),
    "name" : "bar"
}
]);

0
  1. thực hiện tìm kiếm của bạn
  2. kết quả xem nút nhấn ở chế độ JSON
  3. sao chép kết quả te thành từ
  4. in kết quả từ word

Khi tôi có ngày tháng trong tài liệu của mình, nó trả về các phần tử ISODate không phải là định dạng json hợp lệ.
Constantino Cronemberger

1
Tại sao bạn lại sử dụng tài liệu Word để lưu trữ xuất cơ sở dữ liệu? Và tại sao trên thế giới lại có người muốn in bản xuất cơ sở dữ liệu?
maesk

@maesk 🤣🤣🤣🤣
Charlie Schliesser
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.