Odpowiedzi:
Powłoka zapewnia kilka fajnych, ale ukrytych funkcji, ponieważ jest to środowisko interaktywne.
Gdy uruchamiasz polecenia z pliku javascript za pośrednictwem mongo commands.js, nie uzyskasz identycznego zachowania.
Można to obejść na dwa sposoby.
(1) sfałszuj powłokę i spraw, by myślała, że jesteś w trybie interaktywnym
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
lub
(2) użyj Javascript do przetłumaczenia wyniku a find()
na drukowalny JSON
mongo dbname command.js > output.json
gdzie command.js zawiera to (lub jego odpowiednik):
printjson( db.collection.find().toArray() )
Spowoduje to wyświetlenie tablicy wyników, w tym [ ]
- jeśli nie chcesz, możesz iterować po tablicy i printjson()
każdym elemencie.
Nawiasem mówiąc, jeśli uruchamiasz tylko jedną instrukcję Javascript, nie musisz umieszczać jej w pliku i zamiast tego możesz użyć:
$ 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.txt
ale to mi dało JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Ponieważ robisz to na terminalu i chcesz po prostu sprawdzić rekord w rozsądny sposób, możesz użyć takiej sztuczki:
mongo | tee somefile
Używaj sesji w normalny sposób - db.collection.find().pretty()
lub cokolwiek musisz zrobić, zignoruj długie dane wyjściowe i zakończ. Zapis Twojej sesji będzie znajdował się w pliku, tee
do którego została zapisana .
Należy pamiętać, że dane wyjściowe mogą zawierać sekwencje ucieczki i inne śmieci, ponieważ powłoka mongo oczekuje sesji interaktywnej. less
radzi sobie z nimi wdzięcznie.
Po prostu umieść polecenia, które chcesz uruchomić w pliku, a następnie przekaż je do powłoki wraz z nazwą bazy danych i przekieruj dane wyjściowe do pliku. Tak więc, jeśli polecenie find znajduje się, find.js
a baza danych jest foo
, wyglądałoby to tak:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
zadziałało.
Umieść zapytanie (np. db.someCollection.find().pretty()
) W pliku javascript, powiedzmy query.js
. Następnie uruchom go w powłoce swojego systemu operacyjnego za pomocą polecenia:
mongo yourDb < query.js > outputFile
Wynik zapytania będzie w pliku o nazwie „outputFile”.
Domyślnie Mongo drukuje pierwsze 20 dokumentów IIRC. Jeśli chcesz więcej, możesz zdefiniować nową wartość rozmiaru partii w powłoce Mongo, np
DBQuery.shellBatchSize = 100
.
.js
rozszerzenie. Możesz pisać wszystkie te ładne zapytania do powłoki mongo bez ich zmiany.
Używając print
i JSON.stringify
możesz po prostu wygenerować ważny JSON
wynik.
Użyj --quiet
flagi, aby odfiltrować szum powłoki z wyjścia.
Użyj --norc
flagi, aby uniknąć .mongorc.js
oceny. (Musiałem to zrobić ze względu na ładny program formatujący, którego używam, który generuje nieprawidłowe dane wyjściowe JSON ). Użyj DBQuery.shellBatchSize = ?
zastępowania ?
limitem rzeczywistego wyniku, aby uniknąć stronicowania.
Na koniec użyj, tee
aby przesłać dane wyjściowe terminala do pliku:
// 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()
);
Mam nadzieję że to pomoże!
Korzystając z odpowiedzi Asyi Kamsky'ego, napisałem jednowierszowy skrypt dla systemu Windows. Linia wygląda następująco:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Następnie można go uruchomić:
exportToJson.bat DbName CollectionName
Jest też do tego mongoeksport , ale nie jestem pewien, od której wersji jest on dostępny.
Przykład:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
możesz użyć tego polecenia, aby to osiągnąć:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json