MongoDB kabuk çıktısını bir dosyaya 'güzel' yazdırmanın bir yolu var mı?


102

Özellikle, bir mongodbun sonuçlarını find()bir dosyaya yazdırmak istiyorum . JSON nesnesi çok büyük, bu nedenle tüm nesneyi kabuk pencere boyutuyla görüntüleyemiyorum.

Yanıtlar:


217

Kabuk, etkileşimli bir ortam olduğu için bazı hoş ama gizli özellikler sağlar.

Mongo commands.js aracılığıyla bir javascript dosyasından komutları çalıştırdığınızda, tamamen aynı davranışla karşılaşmazsınız.

Bunu aşmanın iki yolu var.

(1) kabuğu taklit edin ve etkileşimli modda olduğunuzu düşünmesini sağlayın

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

veya
(2) bir sonucunu find()yazdırılabilir bir JSON'a çevirmek için Javascript kullanın

mongo dbname command.js > output.json

command.js bunu (veya eşdeğerini) içerir:

printjson( db.collection.find().toArray() )

Bu, sonuç dizisini oldukça basar, [ ]- istemiyorsanız, dizi ve printjson()her bir öğe üzerinde yineleme yapabilirsiniz .

Bu arada, yalnızca tek bir Javascript ifadesi çalıştırıyorsanız, onu bir dosyaya koymanız gerekmez ve bunun yerine şunu kullanabilirsiniz:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

command.js, geçerli dizininizde bulunan ve çalıştırmak istediğiniz javascript'i içeren okunabilir bir dosya olmalıdır.
Asya Kamsky

Uzak bir mongo db için bunu nasıl yaparım? Denedim mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtama verdi JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
Sheharyar

bu hata, --eval'den sonraki tırnak içinde olanın yasal sözdizimi olmadığı anlamına gelir. Tüm ifadelerin dışında tek tırnak kullanmanızı öneririm ve içinde tırnak işareti kullanmanız gerekirse bunun için çift tırnak kullanın.
Asya Kamsky

2
Seçenek 2, eğer bir avuçtan fazla sonuca sahipseniz gerçekten tek seçenektir, çünkü 1. seçenekte sadece daha fazlası için "onu yazın" olarak duracaktır.
Tomty

2
gerçekten değil @Tomty - kabuk partisinin boyutu, kabuk içindeki bir değişkenle kontrol edilebilir. DBQuery.shellBatchSize = 10000'i .mongodbrc.js dosyanıza koyabilirsiniz ve 20 yerine 10000 sonuçtan sonra "duracaktır".
Asya Kamsky

30

Bunu bir terminalde yaptığınız ve bir kaydı mantıklı bir şekilde incelemek istediğiniz için, bunun gibi bir numara kullanabilirsiniz:

mongo | tee somefile

Oturumu normal olarak kullanın - db.collection.find().pretty()ya da ne yapmanız gerekiyorsa, uzun çıktıyı yok sayın ve çıkın. Oturumunuzun bir transkripti yazılan dosyada yer alacaktır tee.

Mongo kabuğunun etkileşimli bir oturum beklemesi nedeniyle çıktının kaçış dizileri ve diğer çöpleri içerebileceğini unutmayın. lessbunları incelikle ele alıyor.


13

Çalıştırmak istediğiniz komutları bir dosyaya koyun, ardından veritabanı adı ile birlikte kabuğa aktarın ve çıktıyı bir dosyaya yönlendirin. Öyleyse, bul komutunuz içindeyse find.jsve veritabanınız fooşöyle görünecektir:

./mongo foo find.js >> out.json

Bu benim için işe yaramadı, sadece kabuk sürümü ve db adını yazdırdı out.json. mongo foo < find.js > out.jsonIş yaptı.
James Brown

1
bu yanıt, araçlar Go'da ve birçok sürümde yeniden yazılmadan önce yazılmıştır, çok eski bir şey kullanmıyorsanız, muhtemelen bu yüzden sizin için çalışmıyor
Adam Comerford

11

Sorgunuzu (örneğin db.someCollection.find().pretty()) bir javascript dosyasına koyun diyelim query.js. Ardından, şu komutu kullanarak işletim sisteminizin kabuğunda çalıştırın:

mongo yourDb < query.js > outputFile

Sorgu sonucu 'outputFile' adlı dosyada olacaktır.

Varsayılan olarak Mongo ilk 20 belgeyi IIRC yazdırır. Daha fazlasını istiyorsanız, Mongo kabuğundaki parti boyutuna yeni bir değer tanımlayabilirsiniz, örn.

DBQuery.shellBatchSize = 100.


Bu. .jsUzantı tarafından yanlış yönlendirilmeyin . Tüm bu güzel mongo kabuğu sorgularını hiç değiştirmeden yazabilirsiniz.
AD

5

Kullanılması printve JSON.stringifysadece bir üretebilir geçerli JSON bir sonuç. Çıkıştan kabuk gürültüsünü filtrelemek için bayrak
kullanın --quiet. Değerlendirmeden kaçınmak için bayrak
kullanın . ( Kullandığım , geçersiz JSON çıktısı üreten bir güzel biçimlendiriciden dolayı yapmak zorundaydım ) Sayfalamayı önlemek için gerçek sonucun sınırıyla değiştirmeyi kullanın .--norc.mongorc.jsDBQuery.shellBatchSize = ??

Ve son olarak, teeterminal çıktısını bir dosyaya yönlendirmek için kullanın:

// 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()
);

Bu yardımcı olur umarım!


2

Asya Kamsky'nin bu cevabını kullanarak Windows için tek satırlık bir yarasa betiği yazdım. Çizgi şuna benzer:

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

Sonra biri çalıştırabilir:

exportToJson.bat DbName CollectionName


2

WriteFile () işlevi ile sonucu kaydetmeyi başardım .

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Mongo kabuk sürümü 4.0.9 idi


1

Ayrıca bunun için mongoexport var, ancak hangi sürümün mevcut olduğundan emin değilim.

Misal:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

0

Gibi cevap Neodan mongoexport tarafından oldukça yararlıdır -qsorgu için seçenek. Ayrıca ObjectIdstandart JSON formatına dönüşür "$oid". Örneğin:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

0

ona ulaşmak için bu komutu kullanabilirsiniz:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

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.