28

我是新手mongodb,想了解如何将json文件从一台服务器导入到另一台服务器。我尝试了以下命令mongoimport -d test -c bik check.json,它对我来说很好。现在我想知道当有多个json文件时如何一次导入所有文件。我找不到任何相关的文档,这是不可能的。请帮助我这是否可能以及如何

4

13 回答 13

34

我想出了一种更优雅的方式来自动导入所有集合:

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

我希望这是有帮助的。

于 2013-10-21T21:11:34.613 回答
26

您总是可以编写一些 shell 脚本。

colls=( mycoll1 mycoll2 mycoll5 )

for c in ${colls[@]}
do
  mongoimport -d mydb -c $c.json
done
于 2012-07-23T09:21:45.970 回答
17

Windows 批处理版本:

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json
)
于 2015-01-07T13:40:01.167 回答
13

你也可以这样做:

for filename in *; do mongoimport --db <Database> --collection <Collection Name> --file $filename; done
于 2017-05-26T07:18:23.617 回答
6

这在 MAC OS X 中对我有用

find . -regex '.*/[^/]*.json' | xargs -L 1 mongoimport --db DB_NAME -u USER_NAME -p PASSWORD --collection COLLECTION_NAME  --file
于 2017-01-15T05:47:33.163 回答
4

对于windows bat 文件。如果您在文件夹中有一个 json 文件列表,这会更好。并且集合名称与文件中的名称匹配

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --db databasename --collection %%~nf --drop --file %%f
)
pause
于 2017-03-17T15:41:15.037 回答
2

一线解决方案:

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

于 2019-07-01T11:30:17.390 回答
2

不确定它是否是一个新功能,但mongoimport现在可以从标准输入中读取。所以导入多个 JSON 文件可以做的很简单

cat *.json | mongoimport --uri "mongdb://user:password@host/db?option=value" --collection example

我正在使用 mongodb-tools v4.2.0 顺便说一句。

更新

mongodbimport可能会消耗大量内存,这可能导致程序被系统 OOM 杀死。我的机器有 32GB 的 RAM,当我尝试导入存储在 RAM 磁盘中的 ~10GB 数据时,这种情况一直发生。

将一个相对较大的作业分成多个批次:

#!/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:pass@host/db" --collection=examples -j8 #--mode=upsert --upsertFields=id1
        json_files=()
    fi
done
于 2019-09-10T08:03:59.180 回答
2

Linux:

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

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

或者,文件夹中的所有文件:

> cat *.json > big.json

> mongoimport --db foo --collection baz --file "big.json"
于 2018-12-07T18:27:05.777 回答
2

另一种单行解决方案(假设您在 json 文件所在的文件夹中):

ls | sed 's/.json$//' | xargs -I{} mongoimport -d DATABASE_NAME -c {} {}.json
于 2018-04-05T13:56:28.327 回答
1

我使用此处的解决方案在我的 bash 配置文件中添加了一个 shell 函数,以便快速执行此操作。

我的示例依赖于将每个集合输出为具有集合名称和.metadata.json扩展名的文件的 mongo 导出。

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

在导出文件的路径中使用,将数据库名称传递给命令...

mimport my_db

将所有集合加载到本地主机的数据库中。

于 2018-10-04T02:21:46.227 回答
1

我将展示如何仅使用 Linux 的终端(它也适用于 Mac)有效地导入许多集合。

您必须将所有 json 文件放在同一个文件夹中,并且文件名应该是要导入数据库的集合。

所以,让我们开始吧,打开包含 json 文件的文件夹。将 替换<DATABASE>为您的数据库名称,然后执行以下行:

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

但是那里发生了什么?

首先,您必须记住括号将首先执行。在这种情况下,它会创建一个所有文件的列表,仅获取每个文件的名称(删除它的扩展名)。

其次,所有列表都将被添加到一个名为集合的局部变量中的循环“for”中(这个变量的名称可以是任何你想要的)

三、“do”执行导入行(*)

最后“完成”,完成循环。

(*) 导入行由“mongoimport”组成,需要数据库名称“--db”、集合名称“--collection”和文件名“--file”。这些要求已由在“for”东西上创建的变量“$collection”填充

我希望对某人有所帮助!祝大家好运 :)

于 2017-07-19T02:47:35.830 回答
0

Python:

from pathlib import Path
import subprocess

jsons_folder = "./out/"
mongodb_host = "172.22.0.3"
mongodb_port = "27017"
mongodb_user = "root"
mongodb_password = "1234"

for f in Path(jsons_folder).glob("*.json"):
    cmd = [
        "mongoimport", "-h", mongodb_host, "-p", mongodb_port, "--authenticationDatabase", "admin",
        "-u", mongodb_user, "-p", mongodb_password,
        "--db", "callscoring", "--collection", "scoring_result_entry", str(f.absolute())
    ]
    subprocess.run(cmd)
于 2021-11-15T13:37:11.137 回答