我正在尝试编写 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}});
}
答案 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。 (例如,规范格式文件由bsondump
和mongodump
创建。有关JSON格式的更多信息,请参见MongoDB extended JSON。)
JSON.parse
不支持规范的JSON格式。它将读取规范格式的输入并返回JavaScript对象,但是将忽略规范格式JSON中存在的扩展数据类型信息。