JSON'u Robomongo kullanarak MongoDB'den dışa aktarma


108

Bu yüzden hakkında pek bir şey bilmiyorum MongoDB. Ben var RoboMongoben bir MongoDB bağlanmak hangi kullanarak. Yapmam gereken şey şu - bu MongoDB'de bir koleksiyon var. Bu koleksiyondaki verileri bir dosyaya kaydedebilmek için dışa aktarmak istiyorum.

Koleksiyondaki verileri metin olarak açmak için arayüzü kullandım ve bir Ctrl+ yaptım Ave bir metin dosyasına yapıştırdım. Ancak, tüm verilerin kopyalanmadığını ve ayrıca metin verilerinde JSON'u doğal olarak bozan çok sayıda yorum olduğunu buldum.

Export As JSONTemiz bir ihracat yapabilmem için RoboMongo'nun bir tesisi olup olmadığını merak ediyorum .

Herhangi bir işaretçi takdir edilmektedir!


Belirli koleksiyonları mı yoksa tam db'yi mi dışa aktarmak istiyorsunuz?
Ramesh Murugesan

1
Bu, Robomongo'nun mevcut bir özelliği değil, ancak github sorun kuyruğuna bir özellik önerisi ekledim: JSON dışa aktarımı ekle . İthalat / ihracatın entegre edilmesi gerektiğine dair genel bir öneri vardır , ancak daha ayrıntılı / pratik kullanım durumları yardımcı olacaktır. Örneğin, bu, bir koleksiyondan, bul sorgusundan, toplama işlem hattından JSON dışa aktarmayı desteklemeli mi? Şu anda en iyi seçeneğiniz standart mongoexportkomut satırı aracını kullanmaktır.
Stennie

1
@Stennie - yorumunuz için teşekkür ederim. Sanırım sorunuza yanıt olarak - müşteri deneyimi açısından bu gerçekten önemli değil. Diğer DB arabirimlerinin çoğunda akış, bir sorgu çalıştırmanız (ölçütle veya ölçüt olmadan), bir dizi sonuç almanızdır. Sağ tıklayın ve "sonuçları şu şekilde dışa aktar ..." deyin. Dolayısıyla aynısı burada da geçerli olmalıdır. Bir koleksiyonun tamamını veya bir bul sorgusunu dışa aktarıyor olmam farketmez. Sonuç panelde görüntülenebilirse, dışa aktarılabilir olmalıdır.
Tanımsız Değişken

1
Basitçe bunu yapabilirsinizmongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Naren

Yanıtlar:


64

tojsonHer kaydı MongoDB kabuk komut dosyasında JSON'a dönüştürmek için kullanabilirsiniz .

Bu komut dosyasını RoboMongo'da çalıştırın:

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

Bu, tüm sonuçları JSON benzeri bir dizi olarak yazdırır.

Sonuç gerçekten JSON değil! Tarihler ve nesne kimlikleri gibi bazı türler, JavaScript işlev çağrıları olarak yazdırılır, örn ISODate("2016-03-03T12:15:49.996Z").

Büyük sonuç kümeleri için çok verimli olmayabilir, ancak sorguyu sınırlayabilirsiniz. Alternatif olarak kullanabilirsiniz mongoexport.


3
Geçerli olmayan json çıktılar. Sadece json tarafından serileştirilmiş kayıtlar tek tek
ruX

Birçok kullanım durumu için, tojson(db.getCollection(...).find(...)["_batch"])sunucudan elde edilen geçerli toplu işin tamamını çıktı almak için kullanılabilir .
Yuval

@Yuval Kelimenin tam anlamıyla ["_batch"]mı demek istiyorsun? Bunun nasıl kullanılacağına bir örnek verebilir misiniz? Bunu Robo 3T 1.2.1 ile denedim, ancak sadece "Komut dosyası başarıyla yürütüldü, ancak gösterilecek sonuç yok" diyor.
Florian Winter

7
@FlorianWinter Bu sadece etrafta dolaşan rastgele bulgulardı. Daha iyi bir çözüm tojson(db.getCollection(...).find(...).toArray()).
Yuval

@Yuval Güzel! O zaman en kolay çözüm bu, benimkinden çok daha iyi. Cevap olarak göndermeyi düşünün. (Ya da benimkini düzenleyin, ama o zaman hak ettiğiniz tüm övgüyü alırdım ki bu biraz haksızlık olur ...)
Florian Winter

60

Hızlı ve kirli bir yol: Sorgunuzu yazın db.getCollection('collection').find({}).toArray()ve sağ tıklayın Copy JSON. Verileri istediğiniz düzenleyiciye yapıştırın.

görüntü açıklamasını buraya girin


4
Düzgün! Robo3t'de dışa aktarma işlevselliği eksikliği düşünüldüğünde hiç de kirli değil. Küçük veri kümeleri için önerilen diğer çözümlere kıyasla çok daha kolay.
Ilya Luzyanin

30

Robomongo'nun kabuk işlevi sorunu çözecektir. Benim durumumda CSV formatı olarak birkaç sütuna ihtiyacım vardı.

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
Bu betiğin çıktısını Robomongo kabuğunun içinde yerel olarak bir csv'ye yazmak mümkün müdür?
xxxvincxxx

Bu bana "Komut dosyası başarıyla yürütüldü, ancak gösterilecek sonuç yok"
veriyor

Hata: 10. Satır:
Atamada

19

Dışarıda birkaç MongoDB GUI var, bunlardan bazıları veri aktarımı için yerleşik desteğe sahip. Http://mongodb-tools.com adresinde MongoDB GUI'lerin kapsamlı bir listesini bulacaksınız.

Tüm koleksiyonları dışa aktarmayı değil, sorgunuzun sonuçlarını dışa aktarmayı istediniz. Ver 3T MongoChef MongoDB Kullanıcı arabirimi bir deneyin, bu araç özel kullanım durumu için desteği vardır.


Studio 3T, işi tamamen beklenenden daha kolay yaptı! : +1:
vinyll

16

bir elektronik tablodaki gibi "dosyaya aktar" mı diyorsunuz? gibi bir .csv?

IMO Bu, Robo 3T'de (eski adıyla robomongo) bunu yapmanın EN KOLAY yoludur:

  1. Robo 3T GUI'nin sağ üst kısmında "Sonuçları metin modunda Görüntüle" düğmesi vardır, tıklayın ve her şeyi kopyalayın

  2. her şeyi bu web sitesine yapıştırın: https://json-csv.com/

  3. İndir düğmesini tıklayın ve artık bir elektronik tabloya sahipsiniz.

Umarım bu, Robo 3T'nin ihracat yeteneklerine sahip olmasını dilerdim.


11

Bu komutu kabukta çalıştırmayın, bu betiği bir komut istemine veritabanı adınız, koleksiyon adınız ve dosya adınızla birlikte girin, tümü yer tutucuları değiştirerek ..

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

Benim için çalışıyor.



5

Anish'in cevabını genişleterek, tüm alanların otomatik olarak çıktısını almak için herhangi bir sorguya uygulayabileceğim bir şeyi, bunları print deyiminde tanımlamak zorunda kalmayı istedim. Muhtemelen basitleştirilebilir, ancak bu harika çalışan hızlı ve kirli bir şeydi:

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 kullanmak istiyorsanız, şu şekilde dışa aktarmak isteyeceksiniz:

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

2

Bir robomongo kabuk komut dosyası kullanarak:

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

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

Mongodb'un dışa aktarma ve içe aktarma komutunu kullanma

--jsonArrayParametre / bayrağı mongoexportkomutunuza ekleyebilirsiniz , bu, sonucu tek bir json dizisi olarak dışa aktarır.

Ardından --jsonArrayiçe aktarırken bayrağı yeniden belirtin .

Veya dosyadaki başlangıç ​​ve bitiş dizisi parantezlerini [] kaldırın, ardından değiştirilen ve dışa aktarılan dosyanız mongoimport, --jsonArraybayrak olmadan komutla içe aktarılır.

Buradan Dışa Aktarma hakkında daha fazla bilgi: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Buradan içe aktarın: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

Aynı sorunu yaşadım ve robomongo'da (Robo 3T 1.1.1) komut dosyası çalıştırmak da değerleri kopyalamaya izin vermiyor ve dışa aktarma seçeneği de yoktu. Bunu başarmanın en iyi yolu mongoexport'u kullanmaktır, eğer mongodb yerelde kuruluysa, herhangi bir sunucudaki veritabanına bağlanmak ve veri çıkarmak için mongoexport'u kullanabilirsiniz.

Uzak sunucudaki Verilere ve csv çıktı dosyasına bağlanmak için, komut satırınızda aşağıdaki mongoexport'u çalıştırı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: istenen sütunların çıkarılmasına yardımcı olur, örn: fields.txt içeriği sadece:

Kullanıcı kimliği

yalnızca 'userId' sütununun değerlerini çıkarmak için

Uzak sunucudaki veriler, json çıktı dosyası:

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

bu, tüm alanları json dosyasına çıkarır

localhost üzerindeki veriler (mongodb localhost üzerinde çalışıyor olmalıdır)

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

Referans: https://docs.mongodb.com/manual/reference/program/mongoexport/#use


1

Çözüm:

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

görüntü açıklamasını buraya girin

Nerede:
veritabanı -> mock-server
koleksiyonu adı -> api_defs
çıktı dosyası adı -> childChoreRequest.json


1

Sorguyu yürütmeye hazır hale getirmek isteyen insanlar için Florian Winter cevabının bir uzantısı .

dropve şunu insertManykullanarak sorgulama 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(']);');
}

Çıktısı şöyle olacaktır:

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

0
  1. araştırmanı yap
  2. JSON modunda basma düğmesi görünümü sonuçları
  3. sonucu kelimeye kopyala
  4. sonucu word'den yazdır

Belgemde tarihler bulunduğunda, geçerli json biçimi olmayan ISODate öğelerini döndürüyor.
Constantino Cronemberger

1
Bir veritabanı dışa aktarımını saklamak için neden bir Word belgesi kullanasınız? Ve neden dünyada bir veritabanı dışa aktarımı yazdırmak istesin ki?
maesk

@maesk 🤣🤣🤣🤣
Charlie Schliesser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.