最近在写一个号码中间四位查询的网站,涉及到大量数据的写入,其中遇到mongoDB大量写入数据时卡死内存溢出的问题,最终的解决方案记录写一下。

最终方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const { MongoClient } = require('mongodb');

// MongoDB连接URI
const uri = 'mongodb://localhost:27017/';

// 要插入的数据库和集合名称
const dbName = 'your_database';
const collectionName = 'your_collection';

// 准备要插入的数据
const dataToInsert = [
{ name: 'John', age: 30 },
{ name: 'Alice', age: 25 },
// 添加更多的数据...
];

// 连接到MongoDB数据库
MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) {
console.error('Failed to connect to MongoDB:', err);
return;
}

console.log('Connected to MongoDB');

const db = client.db(dbName);
const collection = db.collection(collectionName);

// 创建批量操作请求
const requests = dataToInsert.map(data => ({
insertOne: { document: data }
}));

// 执行批量写入
collection.bulkWrite(requests, (err, result) => {
if (err) {
console.error('Failed to insert documents:', err);
return;
}

console.log(`Inserted ${result.insertedCount} documents`);
client.close();
});
});

在这个示例中,确保你已经安装了mongodb Node.js模块。然后,替换'mongodb://localhost:27017/'为你MongoDB数据库的连接URI,'your_database'为你要写入的数据库名称,'your_collection'为你要写入的集合名称。然后,准备好要插入的数据列表dataToInsert,每个对象代表一个文档。连接到数据库后,创建批量写入的请求数组requests,每个请求都是一个包含insertOne操作的对象,该操作指定要插入的文档。最后,通过collection.bulkWrite()执行批量写入操作,并在回调函数中处理结果。

这个方法写入,40多万的数据基本在1分内就完成!