2017-09-29 12 views
7

mongoose集計クエリの結果に対して一括削除を使用しようとしています。集約から文書を一括削除する

var bulk = Collection.collection.initializeUnorderedBulkOp(); 
var cursor = Collection.aggregate(query).cursor({batchSize: 1000}).exec(); 

cursor.each(function(error, doc){ 
    if(doc){ 
    console.log(doc); 
    bulk.find({_id : doc._id}).removeOne(); 
    } 
}); 

if(bulk.length > 0) { 
    bulk.execute(function(error){ 
    if(error){ 
     console.error(error); 
     callback(error); 
    }else{ 
     console.log(bulk.length + " documents deleted"); 
     callback(null); 
    } 
    }); 
} else { 
    console.log("no documents to delete"); 
    callback(null); 
} 

この結果、「削除する文書はありません」という結果が各ループ内の集計の結果より前に出力されます。通常、データベース操作のためのコールバック関数があると思います。私は、execののparamsにコールバック関数を追加しようとしているが、機能はヒットれることは決してありません:

var cursor = Collection.aggregate(query).cursor({batchSize: 1000}).exec(function(error, result){ 
    console.log(error); 
    console.log(result); 
    callback(); 
}); 

答えて

4

カーソル上のデータおよび終了イベントを聴く:

cursor.on('data', function(data) { 
    bulk.find({ "_id" : data._id }).removeOne(); 
}); 

cursor.on('end', function() { 
    if (bulk.length === 0) { 
     callback(); 
    } else { 
     bulk.execute(function (error) { 
      if (error) { 
       callback(error); 
      } else { 
       callback(); 
      } 
     }); 
    } 
}); 
+0

メモリが足りなくなってアプリケーションがクラッシュする可能性があるため、一括して実行します。 5000kコマンドごとに言いましょう。 – Azarus

0

マングースのバージョンは何?関連性のあるissue on githubがあります。だから多分試してみてください:

関連する問題