使用mongoimport导入多个json文件

33

我刚接触 mongodb,想知道如何将一个服务器中的 json 文件导入到另一个服务器。我尝试了以下命令:mongoimport -d test -c bik check.json,对我来说运行良好。现在我想知道当有多个 json 文件时该怎么导入全部。我找不到相关的文档,没写这是否可能。请帮助我,这是否可能以及如何操作。

13个回答

37

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

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

我希望这对你有所帮助。


运行得非常好!实际上我需要导入tsv文件,所以我必须包括 --headerline--type tsv。非常简单。谢谢。 - agarcian
1
它起作用了,让我很开心,但是我不得不在mongoimport命令中添加--jsonArray mongoimport -d tpsmnew -c $col < $col.json --jsonArray;,因为我遇到了这个错误:Failed: cannot decode array into a D。 - mohit jain

27

你可以编写一些shell脚本。

colls=( mycoll1 mycoll2 mycoll5 )

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

3
仅仅是一个问题。是否可以定义一个目录名称,然后只指定目录的路径来导入该目录中所有的“json”文件,而不是具体指定文件名。这是因为如果有多个文件,则必须指定所有文件名,然后执行“for”循环,这与手动执行每个文件的“mongoimport”命令相同。是否可以更动态地完成它? - user850234
1
我尝试过了,但它没有起作用。不过使用mongorestore可以正常工作。 - Sergio Tulentsev
仅供参考。将数据导入为json有一个缺点,它不会保留数据类型。长整型转换为浮点数等。如果在应用程序中遇到任何数字格式异常,请不要感到惊讶(在我们的情况下,我们使用Java)。 - titogeo
@titogeo 我很高兴发生了这件事。我不知道它会这样做。我希望它不会仅仅因为是一个大的 JSON 字符串就把所有东西都转换成字符串。 - Kristian
@Faaiz:使用Romaninsh的版本。它看起来很相似,但是在其中,集合名称与文件名是分开的。 - Sergio Tulentsev
显示剩余3条评论

17

Windows 批处理版本:

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

1
谢谢Tomi。我不得不省略--jsonArray,因为我有多个未封闭在[]中的JSON文件。 - ankit9j

15

你也可以用这种方式来完成:

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

1
简单而实用的解决方案。 - e7lT2P

6

这在我的MAC OS X上有效。

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

4

针对Windows批处理文件,如果在文件夹中有一个JSON文件列表,并且集合名称与文件名匹配,则会更好。

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

3

不确定这是否是一个新功能,但是mongoimport现在可以从stdin读取。所以,导入多个JSON文件的方法就像这样简单:

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

顺便提一下,我正在使用mongodb-tools v4.2.0。

更新

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

将相对较大的作业划分为批处理:

#!/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

2

另外一种单行解决方案(假设您在存放JSON文件的文件夹内):

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

2
最简单的解决方案如下:
使用以下命令在 Windows 命令提示符中循环导入指定目录中所有“.json”文件到 MongoDB 数据库中:
``` for /F %i in ('dir /b c:\files\*.json') do mongoimport.exe /d db /c files /file c:\file\%i ```

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接