How to bufferize efficiently in nodeJS on events from a stream to bulk insert instead of unique insert per record received from the stream. Here’s pseudo code I’ve got in mind:
JavaScript
x
13
13
1
// Open MongoDB connection
2
3
mystream.on('data', (record) => {
4
// bufferize data into an array
5
// if the buffer is full (1000 records)
6
// bulk insert into MongoDB and empty buffer
7
})
8
9
mystream.on('end', () => {
10
// close connection
11
})
12
13
Does this look realistic? Is there any possible optimization? Existing libraries facilitaties that?
Advertisement
Answer
I ended up with a no dependency solution.
JavaScript
1
35
35
1
const { MongoClient } = require("mongodb")
2
const url = process.env.MONGO_URI || "mongodb://localhost:27019";
3
const connection = MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
4
Promise.resolve(connection)
5
.then((db) => {
6
const dbName = "databaseName";
7
const collection = 'collection';
8
const dbo = db.db(dbName);
9
10
let buffer = []
11
12
stream.on("data", (row: any) => {
13
buffer.push(row)
14
if (buffer.length > 10000) {
15
dbo.collection(collection).insertMany(buffer, {ordered: false});
16
buffer = []
17
}
18
});
19
20
stream.on("end", () => {
21
// insert last chunk
22
dbo.collection(collection).insertMany(buffer, {ordered: false})
23
.then(() => {
24
console.log("Done!");
25
db.close();
26
})
27
28
});
29
stream.on("error", (err) => console.log(err));
30
31
})
32
.catch((err) => {
33
console.log(err)
34
})
35