Zdaję sobie sprawę, że jest to dość stare pytanie i że mongodump / mongorestore jest wyraźnie właściwą drogą, jeśli chcesz uzyskać 100% wierny wynik, w tym indeksy.
Potrzebowałem jednak szybkiego i brudnego rozwiązania, które prawdopodobnie byłoby zgodne z poprzednimi i nowymi wersjami MongoDB, pod warunkiem, że nie dzieje się nic dziwnego. I za to chciałem uzyskać odpowiedź na pierwotne pytanie.
Istnieją inne akceptowalne rozwiązania powyżej, ale ten potok uniksowy jest stosunkowo krótki i słodki:
mongo --quiet mydatabase --eval "db.getCollectionNames().join('\n')" | \
grep -v system.indexes | \
xargs -L 1 -I {} mongoexport -d mydatabase -c {} --out {}.json
To tworzy odpowiednio nazwany .json
plik dla każdej kolekcji.
Pamiętaj, że nazwa bazy danych („moja baza danych”) pojawia się dwukrotnie. Zakładam, że baza danych jest lokalna i nie musisz przekazywać poświadczeń, ale łatwo to zrobić zarówno z, jak mongo
i z mongoexport
.
Zauważ, że używam grep -v
do odrzucania system.indexes
, ponieważ nie chcę, aby starsza wersja MongoDB próbowała interpretować kolekcję systemową z nowszej. Zamiast tego zezwalam mojej aplikacji na wykonywanie zwykłych ensureIndex
wywołań w celu odtworzenia indeksów.