javascript - 从 Node 批量插入 mongoDB

标签 javascript node.js mongodb

我在 Windows 计算机中有一个目录,其中包含 350 万个 json 文件,大小从 3kb 到 30kb 不等。我有一些功能:

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

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

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

注释:

  1. 我认为 insertMany 可能很复杂,因为我需要构建一种方法来将此操作分成多个 block ,因为保存条目的单个数组将超出我的可用内存。
  2. 我似乎无法让 glob 正常工作。这可能是基于 Windows 的限制吗?这可能是基于内存的限制吗?不管怎样,现在我想避免使用 glob 来回答。
  3. 我非常感谢有人解释在连接到数据库的单个实例中运行多个连续的 insertOne 操作是否更有意义,或者是否有必要每次都连接和断开连接。

示例代码:

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 确实显示已建立连接并且没有显示任何错误。

最佳答案

您可能希望对所有插入重用数据库连接。连接过程消耗一定量的毫秒。您可以保存,特别是当您有大量文件要导入时。

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

<小时/>

如果您可以考虑 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
)

关于javascript - 从 Node 批量插入 mongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265298/

相关文章:

javascript - Meteor Angular & Request - 如何绑定(bind)?

PHP mongodb求和查询

javascript - 如何在 angular.js 中处理多个异步任务?

javascript - 获取div类内容html

java - 你如何保护 flutter 中的 restful api 端点

javascript - 如何组织项目中的 JavaScript 代码以实现可维护性?

node.js - 在 Node js 中使用 pdfkit 不会更改 PDF 页面大小

javascript - mongoDB:获取对象数组的所有值

javascript - 如果 Bootstrap .popover() 位于 ('hidden.bs.popover' 上,则“销毁”正在触发另一个 'hidden.bs.popover' 事件

javascript - 如何使用 jQuery 一次填充一个无序列表中的一个元素?