我正在使用以下代码测试我的nodejs插入我的MongoDB。当我插入类似10000行的东西时,一切都工作文件。但是如果我尝试插入类似100万的内容,插入操作会停止一段时间,而在nodejs控制台和MongoDB上都没有打印出错误。
我将我的代码和控制台放在下面的MongoDB中,请帮帮我,非常感谢!!
---更新---
为了回复回复中的问题,我还检查了我的mongostat,并且插件在一段时间后停止。但是,我发现了两种现象:
1)在我的笔记本电脑上,通过" npm install mongodb"以及"节点my.js"安装mongodb解析器。以下列服务器输出启动"服务器已启动。"
观察结果:插入正在进行,mongostat显示,大多数时候插入为零,但有时插入的记录可以显示。
2)在我的电脑上,通过" npm --registry http://registry.npmjs.eu/安装mongodb"以及"节点my.js"安装mongodb解析器。以下列服务器输出启动"服务器已启动。 - >无法使用纯JS版本"
加载c ++ bson扩展观察到的结果:插入只运行一段时间,然后没有任何反应,并且mongostat在一段时间后总是显示为零插入。
" npm --registry http://registry.npmjs.eu/可以安装mongodb"也是一个问题?
我的nodejs代码:
mongoClient.connect("mongodb://localhost:27017/testdb", { db : { native_parser : true } }, function(err, database) {
if (err) { console.log(err.message); throw err; }
// create new collection under database
var collection = database.collection('gm_std_measurements_coveringindex');
date = new Date();
// add all Documents
for (var i = 0; i < 1000000; i++) {
var ranNumber = Math.floor((Math.random() * 1000) + 1);
// insert objects after table and index creation
var istObject = {
fkDataSeriesId : ranNumber,
measDateUtc : date,
measDateSite : date,
project_id : ranNumber,
measvalue : ranNumber,
refMeas : false,
reliability : 1.0
};
collection.insert(istObject, { w : 1 }, function(err, docs) {
if (err) {
console.log(err.message);
throw err;
} else {
// do noting to responsed inserted Document
}
});
}
console.log("* Documents created!");
});
MongDB服务器输出:
Thu Apr 17 15:32:18.942 [initandlisten] connection accepted from 127.0.0.1:33228 #70 (3 connections now open)
Thu Apr 17 15:32:18.949 [conn70] end connection 127.0.0.1:33228 (2 connections now open)
Thu Apr 17 15:32:18.951 [initandlisten] connection accepted from 127.0.0.1:33229 #71 (3 connections now open)
Thu Apr 17 15:32:18.952 [initandlisten] connection accepted from 127.0.0.1:33230 #72 (4 connections now open)
Thu Apr 17 15:32:18.952 [initandlisten] connection accepted from 127.0.0.1:33231 #73 (5 connections now open)
Thu Apr 17 15:32:18.953 [initandlisten] connection accepted from 127.0.0.1:33232 #74 (6 connections now open)
Thu Apr 17 15:32:18.953 [initandlisten] connection accepted from 127.0.0.1:33233 #75 (7 connections now open)
Thu Apr 17 15:32:28.520 [FileAllocator] allocating new datafile /var/lib/mongodb/testdb.2, filling with zeroes...
Thu Apr 17 15:32:28.563 [FileAllocator] done allocating datafile /var/lib/mongodb/testdb.2, size: 256MB, took 0.042 secs
Thu Apr 17 15:32:31.517 [conn75] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:23 129ms
Thu Apr 17 15:32:31.517 [conn72] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:37 129ms
Thu Apr 17 15:32:31.517 [conn74] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:31 129ms
Thu Apr 17 15:32:31.517 [conn73] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:19 129ms
答案 0 :(得分:0)
我想我已经以某种方式想出来了。
从Nodejs向MongoDB插入数百万个数据的问题在于,nodejs被生成这些记录并立即发送出去。所有数百万的数据立即出现,并且nodejs本身在一段时间后就被卡住了,而此时MongoDB还没有收到太多的传入插入。
我&#34;摆脱&#34;这个问题是通过设置一次插入10000条记录的间隔方法,每秒调用一次这个间隔,以便nodejs有机会移动到下一个 event将生成的插入发送出去,然后再次开始生成插入。
interval_checkId = setInterval(createSomeInsert, 1000);
createSomeInsert方法:
function createSomeInsert() {
console.log("* Starting to insert another 10K records, current count: " + counter);
var collection = dbPool.collection('gm_std_measurements_coveringindex');
var date = new Date();
var amount = 10 * 1000;
for(var i = 0; i < amount; i++) {
var ranNumber = Math.floor((Math.random() * 1000) + 1);
// insert objects after table and index creation
var istObject = {
fkDataSeriesId : ranNumber,
measDateUtc : date,
measDateSite : date,
project_id : ranNumber,
measvalue : ranNumber,
refMeas : false,
reliability : 1.0
};
collection.insert(istObject, { w : 0 }, function(err, docs){
if(err) {console.log(err); throw err;}
counter++;
});
}
if(counter >= totalTarget) {
clearInterval(interval_checkId);
console.log("Completed Insert, in total : " + counter);
counter = 0;
}
}
但是,我仍然不明白为什么在生成许多插入请求后会阻塞nodejs,以及为什么大多数都不会在后台发送到mongodb。
答案 1 :(得分:-1)
您可以使用mongostat检查脚本的进度或查看是否发生了任何事情。
打开cmd,导航到/ mongodb / bin目录并执行 mongostat --host localhost
这将为您提供mongodb服务器当前正在发生的信息。第一列是插入操作,您必须检查。这表示db中每秒插入的项目数。 还看看&#34;锁定数据库&#34;列,显示数据库的写锁定百分比。较高的百分比意味着写入操作较慢,因为有许多插入,并且每个插入等待前一个完成并解锁数据库。 另外请注意,connection.insert是异步操作,基本上你是在尝试一次向数据库发送100万个插入请求,因为你没有等待任何插入完成。 我10分钟前开始你的脚本,目前我的目标是40万件