使用mongoimport导入多个json文件

时间:2012-07-23 09:19:48

标签: mongodb mongoimport

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

12 个答案:

答案 0 :(得分:24)

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

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

我希望这有用。

答案 1 :(得分:21)

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

colls=( mycoll1 mycoll2 mycoll5 )

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

答案 2 :(得分:13)

Windows Batch版本:

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

答案 3 :(得分:4)

你也可以这样做:

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

答案 4 :(得分:1)

这在MAC OS X中对我有用

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

单行解决方案:

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

答案 8 :(得分:0)

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

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

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

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

但是那里发生了什么?

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

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

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

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

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

我希望有人帮助过!祝你好运:)

答案 9 :(得分:0)

我使用这里的解决方案在我的bash配置文件中添加了一个shell函数,以快速完成此任务。

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

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

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

mimport my_db

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

答案 10 :(得分:0)

Linux:

import argparse

import pytest


def test_required_unknown(capsys):
    """ Try to perform sweep on something that isn't an option. """
    parser=argparse.ArgumentParser()
    parser.add_argument(
        "-c", "--color",
        type=str,
        choices=["yellow", "blue"],
        required=True)
    args = ["--color", "NADA"]

    with pytest.raises(SystemExit):
        parser.parse_args(args)

    stderr = capsys.readouterr().err
    assert 'invalid choice' in stderr

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

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

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

答案 11 :(得分:0)

不确定这是否是一项新功能,但是mongoimport现在实际上可以从stdin中读取。因此,导入多个JSON文件可以做的很简单

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

我正在使用mongodb-tools v4.2.0 btw。

更新

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