我用最新的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