Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Mongoskin中使用无序批量插入?_Javascript_Node.js_Mongodb_Mongodb Query_Mongoskin - Fatal编程技术网

Javascript 如何在Mongoskin中使用无序批量插入?

Javascript 如何在Mongoskin中使用无序批量插入?,javascript,node.js,mongodb,mongodb-query,mongoskin,Javascript,Node.js,Mongodb,Mongodb Query,Mongoskin,使用Mongoskin在节点上执行批量插入(MongoDB 2.6+)时遇到问题 var dbURI=urigoesere; var db=mongo.db(dbURI,{safe:true}); var bulk=db.collection('collection')。初始化eunorderedbulkop(); 对于(变量i=0;i

使用Mongoskin在节点上执行批量插入(MongoDB 2.6+)时遇到问题

var dbURI=urigoesere;
var db=mongo.db(dbURI,{safe:true});
var bulk=db.collection('collection')。初始化eunorderedbulkop();
对于(变量i=0;i<200000;i++){
bulk.insert({number:i},function()){
log('批量插入:',i);
});
}
bulk.execute(函数(错误、结果){
res.json(“发送响应语句”);
}); 
上述代码给出了以下警告/错误:

(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit.
TypeError: Object #<SkinClass> has no method 'execute'
(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit.
TypeError: Object #<SkinClass> has no method 'execute'
(节点)警告:检测到可能的EventEmitter内存泄漏。新增51名听众。使用emitter.setMaxListeners()增加限制。
TypeError:对象#没有方法“execute”
(节点)警告:检测到可能的EventEmitter内存泄漏。新增51名听众。使用emitter.setMaxListeners()增加限制。
TypeError:对象#没有方法“execute”

是否可以使用Mongoskin执行无序批量操作?如果是这样,我做错了什么?

您可以这样做,但您需要更改调用约定才能这样做,因为只有“回调”表单实际返回一个集合对象,可以从中调用
.initializeUnderedBulkop()
方法。您认为它的工作方式也存在一些用法差异:

var dbURI=urigoesere;
var db=mongo.db(dbURI,{safe:true});
db.collection('collection',函数(err,collection){
var bulk=collection.initializeUnderedBulkop();
计数=0;
对于(变量i=0;i<200000;i++){
bulk.insert({number:i});
计数++;
如果(计数%1000==0)
bulk.execute(函数(错误、结果){
//也许做些有结果的事情
bulk=collection.initializeUnderedBulkop();//执行后重置
});      
});
//如果循环不是1000的整数除数
如果(计数%1000!=0)
bulk.execute(函数(错误、结果){
//也许在这里做点什么
});
});
因此,实际的“批量”方法本身不需要回调,其工作方式完全如中所示。exeception是
.execute()
,它实际将语句发送到服务器

虽然驱动程序会在某种程度上为您解决这个问题,但在调用execute之前将太多操作排队可能不是一个好主意。这基本上建立在内存中,虽然驱动程序一次只发送1000个批次(这是服务器限制,整个批次小于16MB),但您可能需要更多的控制,至少要限制内存使用

这就是模测试的要点,如图所示,但是如果构建操作的内存和可能非常大的响应对象对您来说不是问题,那么您可以继续排队操作并调用
.execute()
一次


“响应”的格式与文件中给出的格式相同

批量分页将无法按预期工作,因为您正在回调中将referec替换为批量变量,该回调将在稍后的时间点执行,因此,您的循环将经过前1000次迭代,并且仍然保留对第一个批量opI的引用。我发现mongodb 3.x和mongoskin 2.2.0存在问题,使用Neil Lunn建议的方法,我不知道是否应该单独重新问这个问题,所以我在上创建了一个新的so问题,以澄清Neil Lunn的答案,mongoskin目前不支持实现批量操作所需的抽象。但是,如果您不想重新编写代码,有一种简单的方法可以绕过这些内容,直接转到本机mongojs接口。它利用了mongoskin内部的私有数据,因此并不理想,但它/确实/有效。。。请参阅中的答案,但简短的答案是,从mongoskin db对象,您可以从db获取本机对象。\u native
(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit.
TypeError: Object #<SkinClass> has no method 'execute'
(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit.
TypeError: Object #<SkinClass> has no method 'execute'