我正在尝试从使用node和instagram的api创建的mongodb集合中导出有效的json。我必须遗漏一些东西,因为它看起来应该非常简单。我已经阅读过其他帖子和mongo的文档,特别是关于mongoexport的文档。
我的最终目标是建立一个d3地图。我使用了文档中的基本mongoexport命令,它以下列格式返回了一个json文件:
{'name':'dan'}
{'name':'emma'}
有效的json将是:
[{'name':'dan'},
{'name':'emma'}]
我知道有这方面的解决方法,即使只是找到' $'在崇高的文本中,它将到达每一行的末尾,然后可以添加一个昏迷。在技术上知道这样做的正确方法会很棒。一篇文章建议使用JSON.parse,所以我尝试使用fs.readFile,但它返回错误:
undefined:2
{ "attribution" : null, "tags" : [], "location" : { "latitude" : 48.857141667,
^
SyntaxError: Unexpected token {.
我只需要将整个mongo集合导出到一个有效的json文件中(将成功通过http://jsonlint.com/测试)。
任何帮助都会非常感激。
答案 0 :(得分:12)
使用themongoexport util使用--jsonArray
http://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray
答案 1 :(得分:0)
正如评论中所提到的,直接解析mongodump的结果可能不是一个好主意。 Mongo不保证转储中的元素是有效的json(并且它们不是)。
但是如果你倾向于这样做,你可以使用event-stream来读取换行符分隔的对象流和一个解析器,它允许你的json有单引号而不是双引号(即hanson )。
然后您的代码可能如下所示:
var es = require('event-stream'),
hanson = require('hanson'),
in = process.stdin,
out = process.stdout;
in //read the input stream
.pipe(es.split()) //split it on newline
.pipe(es.map(function(data, cb) {
if (data === '') { //necessary due to the last element produced by split
cb();
} else {
cb(null, hanson.parse(data)); //parse the line with hanson
}
}))
.pipe(es.writeArray(function (err, array){ //convert resulting objects to array
var strArray = JSON.stringify(array);
out.write(strArray + '\n'); //write the resulting array to output stream
}));
如果你有一个有效的json对象流(带双引号),相同的代码将缩短为:
var es = require('event-stream'),
hanson = require('hanson'),
in = process.stdin,
out = process.stdout;
in
.pipe(es.split())
.pipe(es.parse())
.pipe(es.writeArray(function (err, array){
var strArray = JSON.stringify(array);
out.write(strArray + '\n');
}));
为了清晰起见,跳过了错误处理。