使用mongoimport导入多个json文件

使用mongoimport导入多个json文件,json,mongodb,mongoimport,Json,Mongodb,Mongoimport,我不熟悉mongodb,想知道如何将json文件从一台服务器导入到另一台服务器。我尝试了以下命令mongoimport-d test-c bik check.json,对我来说效果很好。现在我想知道当有多个json文件时,如何一次性导入所有这些文件。我找不到任何相关的文件,它是写这是不可能的。请帮助我这是否可能,以及如何始终编写一些shell脚本 colls=( mycoll1 mycoll2 mycoll5 ) for c in ${colls[@]} do mongoimport -d

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

colls=( mycoll1 mycoll2 mycoll5 )

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

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

ls -1 *.json | sed 's/.json$//' | while read col; do 
    mongoimport -d db_name -c $col < $col.json; 
done
ls-1*.json | sed's/.json$/'|同时读取col;做
mongoimport-d db_name-c$col<$col.json;
完成
我希望这会有所帮助。

Windows批处理版本:

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

这在MacOSX中对我很有效

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

对于窗口bat文件。如果文件夹中有json文件列表,这会更好。集合名称与文件中的名称匹配

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

您也可以通过以下方式进行:

for filename in *; do mongoimport --db <Database> --collection <Collection Name> --file $filename; done
*中文件名的
;domongoimport--db--collection--file$filename;完成

我将展示如何仅使用Linux的终端高效地导入许多集合(它也可以在Mac中工作)

必须将所有json文件放在同一文件夹中,并且文件名应为将导入数据库的集合

首先,打开包含json文件的文件夹。将
替换为数据库名称,然后执行以下行:

用于以美元为单位的收款(ls | cut-d'.-f1);domongoimport--db--collection${collection}--file${collection}.json;完成

但是那里发生了什么事?

首先,您必须记住,括号将首先执行。在本例中,它创建一个所有文件的列表,只获取每个文件的名称(删除扩展名)

其次,所有列表都将添加到名为collection的局部变量中的循环“for”(该变量的名称可以是您想要的任何名称)

第三,“do”执行导入行(*)

最后“完成”,完成循环

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

我希望能帮助别人!祝大家好运:)

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


我使用这里的解决方案向我的bash概要文件中添加了一个shell函数,以便快速完成此操作

我的示例依赖于mongo导出将每个集合作为一个文件输出,该文件具有集合名称和
元数据.json
扩展名

函数mimport(){
对于*中的文件名;do
collection=“${filename%.metadata.json}”;
mongoimport--db$1--collection$collection--file$filename;
完成
}

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

mimport my_db

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

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"
单线解决方案:


对于('dir/b c:\files\*.json')中的/F%i,请执行mongoimport.exe/d db/c files/file c:\file\%i
不确定这是否是一项新功能,但
mongoimport
现在实际上可以从stdin读取。因此,导入多个JSON文件的方法非常简单

cat *.json | mongoimport --uri "mongdb://user:password@host/db?option=value" --collection example
顺便说一句,我正在使用mongodb工具v4.2.0

更新

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

要将相对较大的作业分成批,请执行以下操作:

#/usr/bin/env bash
声明-a json_文件=()
对于*.json中的f;做
json_文件+=“$f”
如果[[“${json#u文件[@]}”-ge 1000]];然后
cat“${json_文件[@]}”| mongoimport--uri=”mongodb://user:pass@host/db”--collection=examples-j8#--mode=upsert--upsertFields=id1
json_文件=()
fi
完成

只是一个查询。不可能定义一个目录名,只指定目录的路径以从中导入所有
json
文件,而不是专门指定文件名。这是因为如果有多个文件,那么我们必须指定所有文件名,然后执行
for
循环,这与手动为每个文件执行
mongoimport
命令相同。可以更动态地完成吗?我试过了,但没有成功。不过,它可以与
mongorestore
一起使用。在
colls
上插入当前文件夹中的所有文件怎么样?@eLRuLL:
ls
是您的朋友。仅供参考。将数据导入为json有一个缺点,它不会保留数据类型。长时间转换为浮点数等。若在应用程序中出现任何数字格式异常,请不要感到惊讶(在我们的例子中,我们使用java)。工作非常出色!我实际上需要导入tsv文件,所以我必须包含
--headerline
--type tsv
非常简单。谢谢你,托米。我不得不省略--jsonArray,因为我有多个json文件,这些文件没有包含在[]简单且功能强大的解决方案中。
cat *.json | mongoimport --uri "mongdb://user:password@host/db?option=value" --collection example