gpt4 book ai didi

javascript - 如何从 JSON 文件目录向 mongoDB 添加许多记录?

转载 作者:IT老高 更新时间:2023-10-28 13:25:12 29 4
gpt4 key购买 nike

我在目录“D:/njs/nodetest1/imports/source1/”的许多子目录中保存了大约一百万个 JSON 文件,我想将它们导入到我的 mongoDB 数据库中的集合“users”中。

以下代码正确遍历文件系统。如您所见,它读取目录中的每个项目,如果该项目是目录,它会读取其中的每个项目。对于不是目录的每个项目,它会在将保存变量的变量发送到函数之前对其执行一些操作。

function traverseFS (path){
var files = fs.readdirSync(path);
for (var i in files){
var currentFile = path + '/' + files[i];
var stats = fs.statSync(currentFile);
if (stats.isFile())
runOnFile(currentFile);
else
traverseFS(currentFile);
}
}
traverseFS("D:/njs/nodetest1/imports/source1/")

接下来,我对代码运行一些操作(见下文)。这会读取文件,将其解析为 JSON 对象,将该对象的两个属性读取到变量中,在变量“entry”中创建一个对象并将该变量传递给另一个函数。

function runOnFile(currentFile){
var fileText = fs.readFileSync(currentFile,'utf8');
var generatedJSON = JSON.parse(fileText);
var recordID = generatedJSON.recordID;
var recordText = generatedJSON.recordTexts;
var entry = {recordID:recordID, recordText:recordText};
insertRecord(entry);
}

然后应该使用最后一个函数将数据插入到 mongoDB 中。我认为这就是问题所在。

function insertRecord(entry){
var MongoClient = mongodb.MongoClient;
var MongoURL = 'mongodb://localhost:27017/my_database_name';
MongoClient.connect(MongoURL, function (err, db) {
var collection = db.collection('users');
collection.insert([entry], function (err, result) {
db.close();
});
});
}

我希望这会贯穿文件结构,将 JSON 文件读入对象,然后将这些对象插入到我的 mongoDB 中。相反,它将第一个文件读入数据库,然后停止/挂起。

注意事项:

  • 我不想使用 mongoimport,因为我不想将这些文件中的所有数据插入到我的 MongoDB 数据库中。然而,我并不依赖这种方法的任何方面。如果存在其他解决方案,我愿意接受。
  • 这可以很好地连接到数据库。对于目录中的每个项目,这都会成功创建一个“条目”对象并将其传递给 insertRecord 函数。换句话说,问题必须出现在 insertRecord 部分。但这显然可能是由该过程早期的某些事情引起的。
  • 如果我添加错误处理,不会产生错误。我已将错误处理排除在此帖子之外,因为它会影响代码片段的可读性。

最佳答案

根据 mongodb2.2 (current latest) documentation , insert 已弃用

DEPRECATED

Use insertOne, insertMany or bulkWrite

所以简短的回答可能是将 collection.insert([entry], ...) 更改为 collection.insertOne(entry, ...) 而你完成了。


然后,对于长答案,您说“大约有一百万个 json 文件”,这通常应该以最少的开销使用完全异步方法。

示例代码中有两个(潜在的)瓶颈:

  • fs.readFileSync,这是一个阻塞操作
  • 连接、插入记录和关闭数据库连接

两者都被执行“大约一百万次”。当然,导入通常不会一遍又一遍地进行,并且(希望)不会在需要其性能来完成其他重要任务的机器上进行。不过,示例代码可以轻松地变得更加健壮。

考虑使用 glob模块获取json文件列表。

glob('imports/**/*.json', function(error, files) {...})

这会以异步方式轻松地为您提供完整的文件列表。

然后考虑只连接一次数据库,插入所有内容并关闭一次。

保持或多或少与示例中相同的步骤,我建议如下:

var glob = require('glob'),
mongodb = require('mongodb'),
fs = require('fs'),
MongoClient = mongodb.MongoClient,
mongoDSN = 'mongodb://localhost:27017/my_database_name',
collection; // moved this to the "global" scope so we can do it only once

function insertRecord(json, done) {
var recordID = json.recordID || null,
recordText = json.recordText || null;

// the question implies some kind of validation/sanitation/preparation..
if (recordID && recordText) {
// NOTE: insert was changed to insertOne
return collection.insertOne({recordID: recordID, recordText: recordText}, done);
}

done('No recordID and/or recordText');
}

function runOnFile(file, done) {
// moved to be async
fs.readFile(file, function(error, data) {
if (error) {
return done(error);
}

var json = JSON.parse(data);

if (!json) {
return done('Unable to parse JSON: ' + file);
}

insertRecord(json, done);
});
}

function processFiles(files, done) {
var next = files.length ? files.shift() : null;

if (next) {
return runOnFile(next, function(error) {
if (error) {
console.error(error);
// you may or may not want to stop here by throwing an Error
}

processFiles(files, done);
});
}

done();
}

MongoClient.connect(mongoDSN, function(error, db) {
if (error) {
throw new Error(error);
}

collection = db.collection('users');

glob('imports/**/*.json', function(error, files) {
if (error) {
throw new Error(error);
}

processFiles(files, function() {
console.log('all done');
db.close();
});
});
});

注意:您可以使用 insertMany 收集多个“条目”记录,以利用多个插入的性能增益,尽管我感觉插入的记录比描述的要复杂,它可能会给一些如果处理不当,会出现内存问题。

关于javascript - 如何从 JSON 文件目录向 mongoDB 添加许多记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006600/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com