【问题标题】:Export valid json from mongodb collection从 mongodb 集合中导出有效的 json
【发布时间】: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 集合输出到文件中。在那种情况下猫鼬也会有帮助吗?我查看了文档,但对我来说并不完全清楚。有没有网上看到的例子可以作为参考?

标签: json node.js mongodb


【解决方案1】:

【讨论】:

    【解决方案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'); 
        }));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多