从 mongodb 集合中导出有效的 json

Posted

技术标签:

【中文标题】从 mongodb 集合中导出有效的 json【英文标题】:Export valid json from mongodb collection 【发布时间】:2014-06-02 12:14:07 【问题描述】:

我正在尝试从我使用节点和 instagram 的 api 创建的 mongodb 集合中导出有效的 json。我一定遗漏了一些东西,因为它看起来应该非常简单。我已经阅读了其他帖子和 mongo 的文档,特别是关于 mongoexport。 我的最终目标是建立一个 d3 地图。我使用了文档中的基本 mongoexport 命令,它返回了以下格式的 json 文件:

'name':'dan'
'name':'emma'

有效的 json 是:

['name':'dan',
'name':'emma']

我知道有一些解决方法,即使是在 sublime 文本中找到“$”这样简单的方法,它会到达每一行的末尾,然后可以添加一个昏迷。从技术上知道这样做的正确方法真是太好了。一篇文章建议使用 JSON.parse,所以我尝试使用 fs.readFile 但它返回错误:

undefined:2
 "attribution" : null, "tags" : [], "location" :  "latitude" : 48.857141667,
^
SyntaxError: Unexpected token . 

我只需要将整个 mongo 集合导出到一个有效的 json 文件中(将成功通过 http://jsonlint.com/ 测试)。非常感谢任何帮助。

【问题讨论】:

有点困惑,你为什么使用 mongoexport 而不是 npmjs.org/package/mongoose 之类的东西只是从 mongo 中获取结果...? 我用过一点猫鼬,但总是在使用 Express 时;永远不要只使用一个文件/尝试将 mongodb 集合输出到文件中。在那种情况下猫鼬也会有帮助吗?我查看了文档,但对我来说并不完全清楚。有没有网上看到的例子可以作为参考? 【参考方案1】:

使用mongoexport util使用--jsonArray

http://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

【讨论】:

【参考方案2】:

正如 cmets 中提到的,直接解析 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'); 
    ));

为清楚起见跳过了错误处理。

【讨论】:

以上是关于从 mongodb 集合中导出有效的 json的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB中导出数据为csv文件

如何使用 Robomongo 从 MongoDB 导出 JSON

在 Postman Jetpack 中导出测试集合

从MySQL中导入数据到MongoDB中

在 mongodb 集合中导入 json?

在mongodb集合中导入json吗?