sql >> Database >  >> NoSQL >> MongoDB

Kan geen grote hoeveelheid gegevens naar mongodb vullen met Node.js

Zoals Robbie zei, streams zijn de juiste keuze. fs.createReadStream() moet worden gebruikt in plaats van .readFileSync() . Ik zou beginnen met het maken van een regellezer die een pad aanneemt en welke string/regex je ook wilt splitsen:

linereader.js

var fs = require("fs");
var util = require("util");
var EventEmitter = require("events").EventEmitter;

function LineReader(path, splitOn) {

    var readStream = fs.createReadStream(path);
    var self = this;
    var lineNum = 0;
    var buff = ""
    var chunk;

    readStream.on("readable", function() {

        while( (chunk = readStream.read(100)) !== null) {
            buff += chunk.toString();
            var lines = buff.split(splitOn);

            for (var i = 0; i < lines.length - 1; i++) {
                self.emit("line",lines[i]);
                lineNum += 1;
            }
            buff = lines[lines.length - 1];
        }
    });
    readStream.on("close", function() {
        self.emit("line", buff);
        self.emit("close")
    });
    readStream.on("error", function(err) {
        self.emit("error", err);
    })
}
util.inherits(LineReader, EventEmitter);
module.exports = LineReader;

Dit zal een tekstbestand lezen en "regel"-gebeurtenissen uitzenden voor elke gelezen regel, zodat u ze niet allemaal tegelijk in het geheugen hebt. Gebruik vervolgens het async-pakket (of welke async-lus u ook wilt gebruiken), loop door de bestanden die elk document invoegen:

app.js

var LineReader = require("./linereader.js");
var async = require("async");

var paths = ["./text1.txt", "./text2.txt", "./path1/text3.txt"];
var reader;

async.eachSeries(paths, function(path, callback) {

    reader = new LineReader(path, /\n/g);

    reader.on("line", function(line) {
        var doc = turnTextIntoObject(line);
        db.collection("mycollection").insert(doc);
    })
    reader.on("close", callback);
    reader.on("error", callback);
}, function(err) {
    // handle error and finish;
})


  1. geoNear retourneert onjuiste afstand

  2. is er een manier om ObjectId automatisch te genereren wanneer een mangoestmodel nieuw is?

  3. golang mongodb (mgo) voegt geen documenten in

  4. Hoe voeg ik een laatste veld toe aan een bestaande lente-data-mongodb-documentverzameling?