是否有任何选项可以使用猫鼬执行批量提花?所以基本上有一个数组,并插入每个元素,如果它不存在或更新它,如果它存在? (我正在使用海关_ids)
当我使用.insert MongoDB返回错误E11000的重复键(应该更新)。插入多个新文档工作正常:
var Users = self.db.collection('Users'); Users.insert(data,function(err){ if (err) { callback(err); } else { callback(null); } });
使用.save返回错误,该参数必须是单个文档:
Users.save(data,function(err){ ... }
This answer建议没有这样的选项,但是它是具体的C#,也已经3年了。所以我想知道是否有任何选择使用猫鼬做这个?
谢谢!
解决方法
不是在特定的“猫头鹰”,或至少尚未写作。 2.6版本中的MongoDB shell实际上使用了所有的一般帮助方法中的
“Bulk operations API”“引擎盖”。在实现中,它首先尝试这样做,如果检测到较旧版本的服务器,那么对旧版本的实现会有一个“后备”。
所有的“目前”的黑客方法都使用“遗留”实现或写入关注响应和基本的传统方法。但是,来自任何给定的mongoose模型的.collection访问器基本上可以从本身实现自己实现mongoose的底层“节点本机驱动程序”访问“收集对象”
var mongoose = require('mongoose'),Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); var sampleSchema = new Schema({},{ "strict": false }); var Sample = mongoose.model( "Sample",sampleSchema,"sample" ); mongoose.connection.on("open",function(err,conn) { var bulk = Sample.collection.initializeOrderedBulkOp(); var counter = 0; // representing a long loop for ( var x = 0; x < 100000; x++ ) { bulk.find(/* some search */).upsert().updateOne( /* update conditions */ }); counter++; if ( counter % 1000 == 0 ) bulk.execute(function(err,result) { bulk = Sample.collection.initializeOrderedBulkOp(); }); } if ( counter % 1000 != 0 ) bulk.execute(function(err,result) { // maybe do something with result }); });
主要捕获的是“mongoose方法”实际上意识到,连接可能实际上不会被创建,并且“排队”直到完成。您正在“挖掘”的本地驱动程序不会使这个区别。
所以你真的必须意识到连接是以某种方式或形式建立的。但是,只要你注意到你在做什么,你可以使用本机驱动程序。