节点加载例程完成后 mongodb 集合中的文档 "disappearing"
Documents "disappearing" from mongodb collection after node loading routine is finished
作为 mongodb 和节点的新手,这个特殊问题简直让我发疯:
我写了一个小模块,它读取一个 .csv 文件,把它变成一个 JSON 数组,然后循环加载到 mongodb 集合中,一次一条记录.
当我 运行 在调试时,在 "var v = i;" 行设置断点,我可以查询 mongo 集合,并看到一个接一个填充的记录。
但是,一旦循环结束 - 所有记录的数据都消失了!
实际的记录仍然在那里,但它们都是空的。我刚刚在每条记录中看到的数据已经不在那些记录中了。
这可能是一些有线作用域问题,但是,作为新手,我不能说出那是什么。
这是我的代码:
exports.excelFileParser = function(fileName, tabName, metadataFields){
var assert = require('assert');
console.log(metadataFields);
if(typeof require !== 'undefined') XLSX = require('xlsx');
var mongodb = require('mongodb');
var _ = require('underscore');
var fs = require('fs');
var Converter=require("csvtojson").core.Converter;
var distinctDataFields;
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/datamanager-03-test';
var fileName = 'clean_file.csv';
//fs.writeFileSync(fileName, newCsvLines);
var csvFileName=fileName;
var fileStream=fs.createReadStream(csvFileName);
//new converter instance
var csvConverter=new Converter({constructResult:true});
//end_parsed will be emitted once parsing finished
csvConverter.on("end_parsed",function(jsonObj){
//console.log(jsonObj); //here is your result json object
makeRecords(jsonObj);
});
function makeRecords(result){
console.log(result.length);
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
console.log('Connection established to', url);
var collectionName = 'DC_Facilities';
db.open(function(err, client){
client.createCollection(collectionName, function(err, col) {
});
var collection = db.collection(collectionName);
for(var i =0;i < result.length; i++){
var dataRecord = result[i];
collection.insert(dataRecord);
var v = i;
}
console.log("finished");
db.close();
});
}
});
}
fileStream.pipe(csvConverter);
};
collection.insert
是一个异步函数,因此您在它们中的任何一个有机会完成之前调用 db.close()
。您也不需要调用 createCollection
,因为如果该集合尚不存在,将为您创建。
因此您的代码应该看起来像这样,以便在所有 insert
操作完成之前不会调用 db.close()
:
db.open(function(err, client){
var collection = db.collection(collectionName);
var inserted = 0;
for(var i = 0; i < result.length; i++){
var dataRecord = result[i];
collection.insert(dataRecord, function(err) {
if (++inserted == result.length) {
console.log("finished");
db.close();
}
});
}
});
作为 mongodb 和节点的新手,这个特殊问题简直让我发疯:
我写了一个小模块,它读取一个 .csv 文件,把它变成一个 JSON 数组,然后循环加载到 mongodb 集合中,一次一条记录. 当我 运行 在调试时,在 "var v = i;" 行设置断点,我可以查询 mongo 集合,并看到一个接一个填充的记录。
但是,一旦循环结束 - 所有记录的数据都消失了! 实际的记录仍然在那里,但它们都是空的。我刚刚在每条记录中看到的数据已经不在那些记录中了。
这可能是一些有线作用域问题,但是,作为新手,我不能说出那是什么。
这是我的代码:
exports.excelFileParser = function(fileName, tabName, metadataFields){
var assert = require('assert');
console.log(metadataFields);
if(typeof require !== 'undefined') XLSX = require('xlsx');
var mongodb = require('mongodb');
var _ = require('underscore');
var fs = require('fs');
var Converter=require("csvtojson").core.Converter;
var distinctDataFields;
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/datamanager-03-test';
var fileName = 'clean_file.csv';
//fs.writeFileSync(fileName, newCsvLines);
var csvFileName=fileName;
var fileStream=fs.createReadStream(csvFileName);
//new converter instance
var csvConverter=new Converter({constructResult:true});
//end_parsed will be emitted once parsing finished
csvConverter.on("end_parsed",function(jsonObj){
//console.log(jsonObj); //here is your result json object
makeRecords(jsonObj);
});
function makeRecords(result){
console.log(result.length);
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
console.log('Connection established to', url);
var collectionName = 'DC_Facilities';
db.open(function(err, client){
client.createCollection(collectionName, function(err, col) {
});
var collection = db.collection(collectionName);
for(var i =0;i < result.length; i++){
var dataRecord = result[i];
collection.insert(dataRecord);
var v = i;
}
console.log("finished");
db.close();
});
}
});
}
fileStream.pipe(csvConverter);
};
collection.insert
是一个异步函数,因此您在它们中的任何一个有机会完成之前调用 db.close()
。您也不需要调用 createCollection
,因为如果该集合尚不存在,将为您创建。
因此您的代码应该看起来像这样,以便在所有 insert
操作完成之前不会调用 db.close()
:
db.open(function(err, client){
var collection = db.collection(collectionName);
var inserted = 0;
for(var i = 0; i < result.length; i++){
var dataRecord = result[i];
collection.insert(dataRecord, function(err) {
if (++inserted == result.length) {
console.log("finished");
db.close();
}
});
}
});