【问题标题】:Best way to insert 10,000 JSON files (total 30GB) into MongoDB将 10,000 个 JSON 文件(共 30GB)插入 MongoDB 的最佳方法
【发布时间】:2017-05-17 19:54:56
【问题描述】:

我觉得用python合并所有的json文件不方便,合并后的文件有30G。

我正在使用 mongoDB 和 nodejs。我填充示例 json 的方式是:

var data = require('./data1.json')
var populateDB = function() {
   db.collection('temp', function(err, collection) {
    collection.insert(data, {safe:true}, function(err, result) {});
 });
};

这只会添加一个 json 文件。我应该如何从这里用 10000+ json 文件填充集合?任何建议都非常感谢!

【问题讨论】:

  • 所有文件都称为./dataXXXX.json 吗?就像它们前面有零一样
  • 不,实际文件都有一些随机数

标签: python json node.js mongodb


【解决方案1】:

最简单的方法是编写一个处理一个 JSON 文件的 Node 程序,然后在 shell 中多次运行它:

for i in *.json; do node program.js $i; done

您的 Node 程序只需要从 process.argv 访问名称,而不是对其进行硬编码,但逻辑是相同的。

如果您想在 node 中执行所有操作,则必须读取目录,获取所有 .json 文件,按顺序读取每个文件,然后运行与您发布的代码类似的代码。如果这是一项一次性任务,那么您甚至可以使用“同步”功能来简化您的代码,如果它是一次执行一件事的顺序任务并且您不关心并行添加数据。

【讨论】:

  • 你认为使用 bash 来组合所有的 json 是个好主意吗?这会吃掉所有的内存吗?
  • @user3669481 我认为使用 bash 合并所有 json 文件不是一个好主意。我认为使用 bash 运行可以处理一个 json 文件的节点程序是个好主意。
  • 我最终使用不带节点的 bash 来插入所有数据,但您的回答非常有帮助!
【解决方案2】:

这样的事情会起作用

npm i glob-fs mongodb async --save

const async = require('async');
const fs = require('fs');
const glob = require('glob-fs')({ gitignore: true });
const MongoClient = require('mongodb').MongoClient;

const files = './files/data*.json';
const collection = 'test';
const url = 'mongodb://localhost:27017/test';

// Connect to db
MongoClient.connect(url, function (err, db) {
  if (err) {
    console.log(err);
  }

  // Get the collection
  const col = db.collection(collection);

  glob.readdirPromise(files)
    .then(function (f) {
      return async.eachSeries(f, (item, callback) => {

        fs.readFile(item, 'utf8', function (err, data) {
          if (err) {
            return console.log(err);
          }

          // Insert into mongo
          col.insertMany(JSON.parse(data)).then((r) => {
            console.log(r);
            return callback(r);
          }).catch(function (fail) {
            console.log(fail)
          });

        });
      }, err => {
        console.log(err);
      });
    })
    .then(err => {
      if (err) {
        db.close();
      }
    })
    .catch(err => {
      console.log(err);
    });
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
相关资源
最近更新 更多