我用最新的node.js本地驱动程序(2.0)批量插入大量文档。插入记录不失败重复
我的集合在URL字段中有一个索引,我肯定会从插入的数千行中获取重复项。有没有办法让MongoDB在遇到重复时不会崩溃?
现在我正在批处理记录1000,并使用insertMany。我尝试了各种各样的东西,包括添加{continueOnError = true}。我试图一个接一个地插入我的记录,但它太慢了,我有成千上万的工人在队列中,并且不能真正负担延迟。
集合定义:
self.prods = db.collection('products');
self.prods.ensureIndex({url:1},{unique:true}, function() {});
插入:
MongoProcessor.prototype._batchInsert= function(coll,items){
var self = this;
if(items.length>0){
var batch = [];
var l = items.length;
for (var i = 0; i < 999; i++) {
if(i<l){
batch.push(items.shift());
}
if(i===998){
coll.insertMany(batch, {continueOnError: true},function(err,res){
if(err) console.log(err);
if(res) console.log('Inserted products: '+res.insertedCount+'/'+batch.length);
self._batchInsert(coll,items);
});
}
}
}else{
self._terminate();
}
};
我想插入之前删除索引,然后使用dropDups重建索引,但它似乎有点哈克,我的工人都聚集我不知道如果他们尝试插入记录而另一个进程是重新索引时会发生什么......有没有人有更好的主意?
编辑:
我忘了提一两件事。我插入的项目有一个'已处理'字段,它被设置为'假'。但是,已经在db中的项目可能已经被处理了,所以这个域可以是'true'。因此,我不能插手......或者我可以选择一个未被upsert修改的字段?
我认为你正在寻找批量upserts。 – 2014-10-31 06:58:39
我的问题是,我不能插入,已经在集合中的项目有一个字段'已处理',可以是真或假,而我插入的字段将始终为'假' – xShirase 2014-10-31 11:18:54