【问题标题】:Import JSON with mongo script使用 mongo 脚本导入 JSON
【发布时间】:2015-02-24 14:01:27
【问题描述】:

我正在尝试编写一个 mongo 脚本以从 JSON 文件中导入 jsonArray。我的脚本是.js 格式,我在mongo shell 中使用load() 命令执行它。是否可以使用mongo script 来做到这一点?

我知道我可以改用mongoimport。但我想知道一种使用脚本的方法。

下面给出了我当前脚本中缺少导入部分的内容..

var db = connect("localhost:27017/fypgui");
//Import json to "crimes" collection here 
var crimes = db.crimes.find();
while (crimes.hasNext()){
    var item = crimes.next();
    var year =(item.crime_date != null)?(new Date(item.crime_date)).getFullYear():null;
    db.crimes.update( {_id: item._id}, {$set: {crime_year: year}});
}

【问题讨论】:

    标签: javascript json mongodb


    【解决方案1】:

    这个问题还有另一个答案。虽然有点老了,我还是要回复一下。

    使用 mongo shell 可以做到这一点。

    您可以将 JSON 转换为有效的 JavaScript,方法是在其前面加上 var myData=,然后使用 load() 命令加载 JavaScript。在 load() 之后,您将能够通过 myData 对象从您的 mongo 脚本中访问您的数据。

    data.js

    var myData=
    [
            {
                    "letter" : "A"
            },
            {
                    "letter" : "B"
            },
            {
                    "letter" : "C"
            }
    ]
    

    read.js

    #!/usr/bin/mongo --quiet
    
    // read data
    
    load('data.js');
    
    // display letters
    
    for (i in myData) {
      var doc  = myData[i];
      print(doc.letter);
    }
    

    对于编写 JSON,将结果加载到单个对象中是最简单的。以var result={}开头初始化对象,然后在末尾使用printjson()进行输出。使用标准重定向将数据输出到文件。

    write.js

    #!/usr/bin/mongo --quiet
    
    var result=[];
    
    // read data from collection etc...
    for (var i=65; i<91; i++) {
      result.push({letter: String.fromCharCode(i)});
    }
    
    // output
    print("var myData=");
    printjson(result);
    

    shebang 行 (#!) 可以在 Unix 类型的操作系统(Linux 或 MacOs)上运行,它们也应该可以在带有 Cygwin 的 Windows 上运行。

    【讨论】:

      【解决方案2】:

      不,mongo shell 不具备像成熟的编程环境那样从文件读取和写入的能力。使用 mongoimport,或者用官方驱动的语言编写脚本。 Node.js 的语法非常接近 mongo shell,尽管 Node.js 是一个异步/事件驱动的编程环境。如果您不想处理结构化逻辑以使用回调,Python/PyMongo 将与此类似且易于学习。

      【讨论】:

        【解决方案3】:

        嘿,我知道这无关紧要,但是,每次我需要将一些 json 导入到我的 mongo db 时,我都会做一些糟糕的复制、粘贴和运行,直到我受够了!!! 如果你遭受同样的痛苦,我会写一个小批量脚本来为我做这件事。有兴趣吗?

        https://github.com/aminjellali/batch/blob/master/mongoImporter.bat

        @echo off
        title = Mongo Data Base importing tool
        goto :main
        
        :import_collection
            echo importing %~2
            set file_name=%~2
            set removed_json=%file_name:.json=%
            mongoimport --db %~1 --collection %removed_json% --file %~2
        goto :eof
        
        :loop_over_files_in_current_dir
            for /f %%c in ('dir /b *.json') do call :import_collection %~1 %%c
        goto :eof
        
        :main
            IF [%1]==[] (
            ECHO FATAL ERROR: Please specify a data base name
            goto :eof
            ) ELSE (
            ECHO @author amin.jellali
            ECHO @email a.j.amin.jellali@gmail.com
            echo starting import...
            call :loop_over_files_in_current_dir %~1
            echo import done...
            echo hope you enjoyed me
            )
        goto :eof
        

        【讨论】:

          【解决方案4】:

          可以使用 mongo shell 中未记录的 cat() 函数将文件内容作为文本获取:

          var text = cat(filename);
          

          如果您对cat() 和其他未记录的实用程序(例如writeFile)感兴趣,请在此文件中定义:shell_utils_extended.cpp

          有了文件的内容,你可以随意修改或直接传递给JSON.parse获取JavaScript对象:

          jsObj = JSON.parse(text);
          

          但要小心:不幸的是,JSON.parse 在 JSON 解析能力方面并不等同于 mongoimport 工具。

          mongoimport 能够以规范格式解析 Mongo 的扩展 JSON。 (例如,规范格式文件由bsondumpmongodump 创建。有关JSON 格式的更多信息,请参阅MongoDB extended JSON)。

          JSON.parse 不支持规范的 JSON 格式。它将读取规范格式输入并返回 JavaScript 对象,但以规范格式 JSON 存在的扩展数据类型信息将被忽略。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-15
            • 1970-01-01
            • 2020-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-01
            • 1970-01-01
            相关资源
            最近更新 更多