从节点

时间:2016-12-21 14:36:43

标签: javascript node.js mongodb

我在Windows机器中有一个目录,有350万个json文件,范围从3到30kb。我有一些功能:

myBuilder(json){
       //some stuff producing an object named entry
       return entry
 }

我想要做的就是读取目录中的每个文件,通过myBuilder运行它们并将它们全部插入到mongo数据库中。我在下面发布了我最好的尝试。

达到预期结果的最简单方法是什么?

注意:

  1. 我认为insertMany可能很复杂,因为我需要构建一种方法将此操作分解为块,因为保存条目的单个数组会超出我的可用内存。
  2. 我似乎无法让glob工作。它可能是基于Windows的限制吗?它可能是基于记忆的限制吗?无论哪种方式,现在我想避免使用glob的答案。
  3. 我真的很感激有人解释在连接数据库的单个实例中运行多个连续的insertOne操作是否更有意义,或者是否每次都需要连接和断开连接。
  4. 示例代码:

    var fs = require('fs');
    var mongodb = require('mongodb');
    var MongoClient = mongodb.MongoClient;
    var MongoURL = 'mongodb://localhost:27017/my_database_name';
    traverseFileSystem('/nodejs/nodetest1/imports');
    
    function traverseFileSystem(path){
        var files = fs.readdirSync(currentPath);
        for (var i in files) {
           var currentFile = path + '/' + files[i];
           var stats = fs.statSync(currentFile);
           if (stats.isFile()){
              var fileText = fs.readFileSync(currentFile,'utf8');
              var json= JSON.parse(fileText);
              var entry = myBuilder(json);    // note this is described above
              insertToMongo(entry);
           }
       }
    }
    function insertToMongo(entry){
        console.log(entry);
        MongoClient.connect(MongoURL, function (err, db) {
            var collection = db.collection('users');    
            collection.insert(entry, function (err, result) {
                if(err)
                    console.log("error was"+err);
                else
                    console.log("entry was"+result);
                db.close();
            });
        });
    }
    

    这会将目录中每个文件的格式良好的条目传递(并记录到控制台)。但它不会显示任何条目的正面错误或结果。 Mongo确实显示已建立连接,并且不会显示任何错误。

1 个答案:

答案 0 :(得分:0)

您可能希望为所有插入重用db连接。连接过程消耗一定量的ms。您可以保存,特别是如果您要导入大量文件。

关于一次插入一个或多个文档,您可以使用bulk operations。即通过使用循环,如:读取10个文件,“批量”-them并执行。也使用相同的数据库连接。

在这种情况下你可以考虑mongoimport:

您可以将终端中的mongoimport用于import all .json files within a directory

@echo off
for %%f in (*.json) do (
    "mongoimport.exe" --jsonArray --db databasename --collection collectioname --file %%~nf.json
)