使用mongo脚本导入JSON

时间:2014-12-27 20:04:50

标签: javascript json mongodb

我正在尝试编写 mongo脚本以从jsonArray文件导入JSON。我的脚本是.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}});
}

4 个答案:

答案 0 :(得分:6)

这个问题还有另一个答案。即使它有点老了,我也会回应。

可以使用mongo shell执行此操作。

您可以通过在var myData=前添加前缀,将JSON转换为有效的JavaScript,然后使用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 lines(#!)适用于Unix类型的操作系统(Linux或MacOs),它们也可以在Windows上使用Cygwin。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

嘿,我知道这不是无关紧要的事,但是,每次我需要将一些json导入我的mongo数据库时,我都会进行一些简单的复制,粘贴和运行,直到我受够了!!! 如果您遇到同样的问题,我会写一个很小的批处理脚本来为我做。有兴趣吗?

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

答案 3 :(得分:0)

可以使用mongo shell中未公开的cat()函数以文本形式获取文件内容:

var text = cat(filename);

如果您对cat()和其他未公开的实用程序(例如writeFile)感兴趣,请在以下文件中进行定义:shell_utils_extended.cpp

拥有文件的内容后,您可以根据需要对其进行修改,或者将其直接传递给JSON.parse以获取JavaScript对象:

jsObj = JSON.parse(text);

但是要小心:很遗憾,就其JSON解析功能而言,JSON.parse不等同于mongoimport工具。

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

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