วิธีการส่งออก JSON จาก MongoDB โดยใช้ Robomongo


108

MongoDBดังนั้นผมจึงไม่ทราบมากเกี่ยวกับ ฉันRoboMongoใช้ที่ฉันเชื่อมต่อกับ MongoDB สิ่งที่ฉันต้องทำคือสิ่งนี้ - มีคอลเล็กชันใน MongoDB นั้น ฉันต้องการส่งออกข้อมูลจากคอลเล็กชันนั้นเพื่อที่ฉันจะได้บันทึกลงในไฟล์

ฉันใช้อินเทอร์เฟซเพื่อเปิดข้อมูลจากคอลเล็กชันเป็นข้อความและทำCtrl+ Aและวางลงในไฟล์ข้อความ อย่างไรก็ตามฉันพบว่าไม่ได้คัดลอกข้อมูลทั้งหมดและยังมีความคิดเห็นมากมายในข้อมูลข้อความซึ่งทำให้ JSON แตกโดยธรรมชาติ

ฉันสงสัยว่า RoboMongo มีExport As JSONสิ่งอำนวยความสะดวกเพื่อให้ฉันสามารถส่งออกที่สะอาดได้หรือไม่

ขอแนะนำคำแนะนำใด ๆ !


คุณต้องการส่งออกคอลเลกชันเฉพาะหรือฐานข้อมูลแบบเต็ม?
Ramesh Murugesan

1
นี้ไม่ได้เป็นคุณลักษณะปัจจุบันของ Robomongo แต่ฉันได้เพิ่มข้อเสนอแนะคุณลักษณะในคิวปัญหา GitHub: เพิ่มการส่งออก JSON มีข้อเสนอแนะทั่วไปว่าควรรวมการนำเข้า / ส่งออกแต่กรณีการใช้งานที่ละเอียด / ใช้งานได้จริงจะเป็นประโยชน์ ตัวอย่างเช่นสิ่งนี้ควรสนับสนุนการส่งออก JSON จากคอลเลกชันค้นหาคิวรีไปป์ไลน์การรวมหรือไม่ ขณะนี้ตัวเลือกที่ดีที่สุดของคุณคือใช้mongoexportเครื่องมือบรรทัดคำสั่งมาตรฐาน
Stennie

1
@Stennie - ขอบคุณสำหรับความคิดเห็นของคุณ ฉันเดาว่าในคำตอบสำหรับคำถามของคุณ - จากมุมมองประสบการณ์ของลูกค้ามันไม่สำคัญจริงๆ ในอินเทอร์เฟซ DB อื่น ๆ ส่วนใหญ่โฟลวคือคุณเรียกใช้แบบสอบถาม (มีหรือไม่มี critera) รับชุดผลลัพธ์ คลิกขวาและพูดว่า "ส่งออกผลลัพธ์เป็น ... " เช่นเดียวกันกับที่นี่ ไม่สำคัญว่าฉันจะส่งออกคอลเล็กชันทั้งหมดหรือค้นหาคำค้นหา หากผลลัพธ์สามารถแสดงในแผงควบคุมได้ก็ควรส่งออกได้
ตัวแปรที่ไม่ได้กำหนด

1
แค่ทำได้mongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
เรนทร์

คำตอบ:


64

คุณสามารถใช้tojsonการแปลงแต่ละระเบียน JSON ในสคริปต์ MongoDB เปลือก

เรียกใช้สคริปต์นี้ใน RoboMongo:

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

สิ่งนี้จะพิมพ์ผลลัพธ์ทั้งหมดเป็นอาร์เรย์คล้าย JSON

ผลลัพธ์ไม่ใช่ JSON จริงๆ! บางประเภทเช่นวันที่และรหัสออบเจ็กต์จะพิมพ์เป็นการเรียกฟังก์ชัน JavaScript เช่นISODate("2016-03-03T12:15:49.996Z").

อาจไม่มีประสิทธิภาพมากนักสำหรับชุดผลลัพธ์ขนาดใหญ่ แต่คุณสามารถ จำกัด การสืบค้นได้ mongoexportหรือคุณสามารถใช้


3
เอาต์พุต json ไม่ถูกต้อง เพียง json-serialized บันทึกทีละรายการ
ruX

สำหรับการใช้งานหลายกรณีสามารถใช้tojson(db.getCollection(...).find(...)["_batch"])เพื่อส่งออกทั้งหมดของชุดงานปัจจุบันที่ได้รับจากเซิร์ฟเวอร์
Yuval

@Yuval คุณหมายถึงตัวอักษร["_batch"]? คุณสามารถยกตัวอย่างวิธีการใช้งานนี้ได้หรือไม่? ฉันลองใช้กับ Robo 3T 1.2.1 แต่มันบอกเพียงว่า "สคริปต์ทำงานสำเร็จ แต่ไม่มีผลลัพธ์ให้แสดง"
Florian Winter

7
@FlorianWinter นั่นเป็นเพียงการค้นพบแบบสุ่มจากการเล่นซอ tojson(db.getCollection(...).find(...).toArray())วิธีการแก้ปัญหาที่ดีกว่าคือ
Yuval

@ ยูวัลดี! นั่นเป็นทางออกที่ง่ายที่สุดแล้วดีกว่าของฉันมาก ลองโพสต์เป็นคำตอบ (หรือแก้ไขของฉัน แต่ฉันก็จะได้รับเครดิตทั้งหมดที่คุณสมควรได้รับซึ่งจะค่อนข้างไม่ยุติธรรม ... )
Florian Winter

60

และวิธีที่สกปรกอย่างรวดเร็ว: เพียงแค่เขียนคำค้นหาของคุณเป็นและคลิกขวาdb.getCollection('collection').find({}).toArray() Copy JSONวางข้อมูลในตัวแก้ไขที่คุณเลือก

ใส่คำอธิบายภาพที่นี่


4
เรียบร้อย! ไม่สกปรกเลยเนื่องจากไม่มีฟังก์ชันการส่งออกใน robo3t ง่ายกว่ามากสำหรับชุดข้อมูลขนาดเล็กเมื่อเทียบกับโซลูชันที่แนะนำอื่น ๆ
Ilya Luzyanin

30

การทำงานของเชลล์ของ Robomongo จะช่วยแก้ปัญหาได้ ในกรณีของฉันฉันต้องการสองสามคอลัมน์เป็นรูปแบบ 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
เป็นไปได้หรือไม่ที่จะเขียนเอาต์พุตของสคริปต์นี้ลงใน csv ในเครื่องโดยใช้ Robomongo shell
xxxvincxxx

สิ่งนี้ทำให้ฉัน "สคริปต์ดำเนินการสำเร็จ แต่ไม่มีผลลัพธ์ที่จะแสดง"
Shanika Ediriweera

ข้อผิดพลาด: บรรทัดที่ 10: ด้านซ้ายมือในการมอบหมายไม่ถูกต้อง
Eugen Sunic

19

มี MongoDB GUI อยู่ไม่กี่ตัวบางตัวมีการรองรับการส่งออกข้อมูลในตัว คุณจะพบรายการ MongoDB GUI ทั้งหมดที่http://mongodb-tools.com

คุณได้ถามเกี่ยวกับการส่งออกผลลัพธ์ของคำค้นหาของคุณไม่ใช่เกี่ยวกับการส่งออกคอลเล็กชันทั้งหมด ลองใช้3T MongoChef MongoDB GUIเครื่องมือนี้รองรับกรณีการใช้งานเฉพาะของคุณ


Studio 3T ทำงานง่ายกว่าที่คาดไว้โดยสิ้นเชิง! : +1:
vinyll

16

คุณพูดว่า "ส่งออกไปยังไฟล์" เหมือนในสเปรดชีต? ชอบ. csv?

IMO นี่เป็นวิธีที่ง่ายที่สุดใน Robo 3T (เดิมชื่อ robomongo):

  1. ที่ด้านขวาบนของ Robo 3T GUI มีปุ่ม "ดูผลลัพธ์ในโหมดข้อความ" ให้คลิกและคัดลอกทุกอย่าง

  2. วางทุกอย่างลงในเว็บไซต์นี้: https://json-csv.com/

  3. คลิกปุ่มดาวน์โหลดและตอนนี้คุณมีอยู่ในสเปรดชีต

หวังว่านี่จะช่วยใครบางคนได้ตามที่ฉันต้องการ Robo 3T มีความสามารถในการส่งออก


11

อย่ารันคำสั่งนี้บนเชลล์ป้อนสคริปต์นี้ที่พรอมต์คำสั่งด้วยชื่อฐานข้อมูลชื่อคอลเลกชันและชื่อไฟล์ของคุณทั้งหมดแทนที่ตัวยึดตำแหน่ง ..

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

มันใช้ได้กับฉัน


8

ฉันไม่คิดว่า robomongo มีคุณสมบัติเช่นนี้ ดังนั้นคุณควรใช้ฟังก์ชัน mongodb เป็น mongoexport สำหรับคอลเลคชันเฉพาะ

http://docs.mongodb.org/manual/reference/program/mongoexport/#export-in-json-format

แต่ถ้าคุณกำลังมองหาโซลูชันสำรองจะดีกว่าที่จะใช้

mongodump / mongorestore

5

เมื่อขยายคำตอบของ Anish ฉันต้องการบางสิ่งที่สามารถนำไปใช้กับแบบสอบถามใด ๆ เพื่อส่งออกฟิลด์ทั้งหมดโดยอัตโนมัติและต้องกำหนดไว้ในคำสั่งการพิมพ์ มันอาจจะง่ายขึ้น แต่นี่เป็นสิ่งที่รวดเร็วและสกปรกซึ่งใช้งานได้ดี:

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

หากคุณต้องการใช้mongoimportคุณจะต้องส่งออกด้วยวิธีนี้:

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

2

การใช้สคริปต์เชลล์ robomongo:

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

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

ใช้คำสั่งส่งออกและนำเข้าของ mongodb

คุณสามารถเพิ่ม--jsonArrayพารามิเตอร์ / แฟล็กในmongoexportคำสั่งของคุณซึ่งจะส่งออกผลลัพธ์เป็นอาร์เรย์ json เดียว

จากนั้นระบุ--jsonArrayแฟล็กอีกครั้งเมื่อนำเข้า

หรือลบวงเล็บอาร์เรย์เริ่มต้นและสิ้นสุด [] ในไฟล์จากนั้นไฟล์ที่แก้ไขและส่งออกของคุณจะนำเข้าด้วยmongoimportคำสั่งโดยไม่มี--jsonArrayแฟล็ก

เพิ่มเติมเกี่ยวกับการส่งออกที่นี่: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

นำเข้าที่นี่: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

ฉันมีปัญหาเดียวกันนี้และการเรียกใช้สคริปต์ใน robomongo (Robo 3T 1.1.1) ก็ไม่อนุญาตให้คัดลอกค่าและไม่มีตัวเลือกการส่งออกเช่นกัน วิธีที่ดีที่สุดที่ฉันสามารถทำได้คือใช้ mongoexport หากติดตั้ง mongodb ในเครื่องของคุณคุณสามารถใช้ mongoexport เพื่อเชื่อมต่อกับฐานข้อมูลบนเซิร์ฟเวอร์ใดก็ได้และดึงข้อมูล

ในการเชื่อมต่อกับข้อมูลบนเซิร์ฟเวอร์ระยะไกลและไฟล์เอาต์พุต csv ให้รัน mongoexport ต่อไปนี้ในบรรทัดคำสั่งของคุณ

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

fieldFile: ช่วยแยกคอลัมน์ที่ต้องการเช่นเนื้อหาของ fields.txt สามารถเป็นเพียง:

userId

เพื่อแยกเฉพาะค่าของคอลัมน์ 'userId'

ข้อมูลบนเซิร์ฟเวอร์ระยะไกลไฟล์เอาต์พุต json:

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

สิ่งนี้จะแยกฟิลด์ทั้งหมดลงในไฟล์ json

ข้อมูลบน localhost (mongodb ควรทำงานบน localhost)

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

อ้างอิง: https://docs.mongodb.com/manual/reference/program/mongoexport/#use


1

สารละลาย:

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

ใส่คำอธิบายภาพที่นี่

ที่ไหน:
ฐานข้อมูล ->
ชื่อคอลเลกชันเซิร์ฟเวอร์จำลอง->
ชื่อไฟล์เอาต์พุตapi_defs -> childChoreRequest.json


1

ส่วนขยายสำหรับคำตอบของFlorian Winterสำหรับผู้ที่ต้องการสร้างพร้อมที่จะดำเนินการค้นหา

dropและinsertManyสอบถามโดยใช้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(']);');
}

ผลลัพธ์จะเป็นดังนี้:

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

0
  1. ทำการค้นหาของคุณ
  2. การดูปุ่มกดส่งผลในโหมด JSON
  3. คัดลอกผลลัพธ์เป็นคำ
  4. พิมพ์ผลลัพธ์จาก word

เมื่อฉันมีวันที่ในเอกสารของฉันมันจะส่งคืนองค์ประกอบ ISODate ซึ่งไม่ใช่รูปแบบ json ที่ถูกต้อง
Constantino Cronemberger

1
เหตุใดคุณจึงใช้เอกสาร Word เพื่อจัดเก็บการส่งออกฐานข้อมูล แล้วทำไมใคร ๆ ในโลกนี้ถึงต้องการพิมพ์การส่งออกฐานข้อมูล?
maesk

@maesk 🤣🤣🤣🤣
Charlie Schliesser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.