Ö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:
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
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtama verdi JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
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.
Ç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
out.json. mongo foo < find.js > out.jsonIş yaptı.
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.
.jsUzantı tarafından yanlış yönlendirilmeyin . Tüm bu güzel mongo kabuğu sorgularını hiç değiştirmeden yazabilirsiniz.
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!
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
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
ona ulaşmak için bu komutu kullanabilirsiniz:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json