web-gelistirme-sc.com

Mongoimport kullanarak 1'den fazla json dosyası alın

mongodb için yeniyim ve json dosyasını bir sunucudan diğerine içe aktarma hakkında bilmek istiyorum. Aşağıdaki komutu mongoimport -d test -c bik check.json denedim ve benim için iyi çalışıyor. Şimdi birden fazla json dosya olduğunda bilmek isterim, hepsini tek bir seferde nasıl alırım. Bunun mümkün olmadığı bir yazılı belge bulamadım. Lütfen bana bu mümkün ve nasıl yardımcı olun

19
user850234

Her zaman bazı Shell scriptleri yazabilirsiniz.

colls=( mycoll1 mycoll2 mycoll5 )

for c in ${colls[@]}
do
  mongoimport -d mydb -c $c.json
done
21
Sergio Tulentsev

TÜM koleksiyonları otomatik olarak içe aktarmak için daha zarif bir yol buldum:

ls -1 *.json | sed 's/.json$//' | while read col; do 
    mongoimport -d db_name -c $col < $col.json; 
done

Umarım bu yardımcı olur.

23
romaninsh

Windows Toplu sürümü:

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json
)
13
Tomi Kokkonen

Bunu da bu şekilde yapabilirsiniz:

for filename in *; do mongoimport --db <Database> --collection <Collection Name> --file $filename; done
3
helpdoc

Bir satır çözüm:

for /F %i in ('dir /b c:\files\*.json') do mongoimport.exe /d db /c files /file c:\file\%i

1
user854301

Bu benim için MAC OS X’de işe yaradı.

find . -regex '.*/[^/]*.json' | xargs -L 1 mongoimport --db DB_NAME -u USER_NAME -p PASSWORD --collection COLLECTION_NAME  --file
1

Başka bir satır çözüm (json dosyalarının bulunduğu klasörde olduğunuzu varsayarak):

ls | sed 's/.json$//' | xargs -I{} mongoimport -d DATABASE_NAME -c {} {}.json
1
Sam Kenny

Linux:

> cat one.json two.json > three.json

> mongoimport --db foo --collection baz --file three.json"

Veya, klasördeki tüm dosyalar:

> cat *.json > big.json

> mongoimport --db foo --collection baz --file "big.json"

windows bat dosyası için. Klasördeki json dosyalarının bir listesi varsa, bu daha iyi olurdu. ve koleksiyon adı, dosyalardaki adla eşleşiyor

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --db databasename --collection %%~nf --drop --file %%f
)
pause
0
Eduardo

Buradaki çözümleri hızlıca yapmak için bash profilime bir Shell işlevi eklemek için kullandım.

Örnekim, her koleksiyonu koleksiyon adı ve .metadata.json uzantılı bir dosya olarak çıkaran mongo ihracatına bağlıdır.

function mimport() { for filename in *; do collection="${filename%.metadata.json}"; mongoimport --db $1 --collection $collection --file $filename; done }

Dışa aktarma dosyalarının yolunda kullanın, DB adını komuta geçirin ...

mimport my_db

Localhost'taki tüm koleksiyonları DB'ye yükler.

0
Teeks

Sadece Linux terminalini kullanarak birçok koleksiyonun nasıl verimli bir şekilde ithal edildiğini göstereceğim (Mac'te de çalışmaktadır).

Tüm json dosyalarının aynı klasörde olması ve dosyanın adı veritabanınıza alınacak koleksiyon olmalıdır.

Şimdi başlayalım, json dosyalarınızı içeren klasörü açın. <DATABASE> dosyasını veritabanı adınızla değiştirin, ardından aşağıdaki satırı yürütün:

for collection in $(ls | cut -d'.' -f1); do mongoimport --db <DATABASE> --collection ${collection} --file ${collection}.json; done

Ama orada neler oluyor?

Öncelikle, parantezlerin önce idam edileceğini aklınızda tutmanız gerekir. Bu durumda, her dosyanın yalnızca adını alan tüm dosyaların bir listesini oluşturur (uzantısını kaldırarak).

İkincisi, tüm liste toplama adı verilen yerel bir değişkende "for" döngüsüne eklenecektir (bu değişkenin adı istediğiniz herhangi bir şey olabilir)

Üçüncüsü, "do" alma satırını uygular (*)

Sonunda "bitti", döngüyü bitirin.

(*) İçe aktarma satırı, "--db" veritabanı adını, "--collection" koleksiyon adını ve "--file" dosya adını gerektiren "mongoimport" ile oluşur. Bu gereksinimler, "for" alanında yaratılan "$ collection" değişkeni tarafından karşılandı.

Umarım birine yardım etmişsindir! İyi şanslar arkadaşlar :)

0
Luan Rodrigues

Bunun yeni bir özellik olup olmadığından emin değilim, ancak mongoimport şimdi gerçekten stdin'den okuyabilir. Bu yüzden birden çok JSON dosyasını içe aktarmak için neler yapabilir?

cat *.json | mongoimport --uri "mongdb://user:[email protected]/db?option=value" --collection example

Mongodb-tools v4.2.0 btw kullanıyorum.

GÜNCELLEME

mongodbimport, programın sistem OOM tarafından öldürülmesine neden olabilecek yüksek miktarda bellek tüketebilir. Makinem 32 GB RAM değerine sahip ve bu sürekli olarak RAM diskinde depolanan ~ 10 GB veriyi almaya çalıştığımda oldu.

Nispeten büyük bir işi gruplar halinde bölmek için:

#!/usr/bin/env bash

declare -a json_files=()
for f in *.json; do
    json_files+="$f"
    if [[ "${#json_files[@]}" -ge 1000 ]]; then
        cat "${json_files[@]}" | mongoimport --uri="mongodb://user:[email protected]/db" --collection=examples -j8 #--mode=upsert --upsertFields=id1
        json_files=()
    fi
done
0
Frederick Zhang