批量删除汇总的文档

时间:2017-09-29 11:09:55

标签: mongodb mongoose mongodb-query aggregation-framework

我正在尝试对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();
});

2 个答案:

答案 0 :(得分: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();
            }
        });
    }
});

答案 1 :(得分:0)

什么版本的猫鼬?可能有issue on github可能是相关的。所以也许试试:

var stream = Model
.aggregate(pipeline)
.cursor({ batchSize: 1000 })
.exec().stream();

stream.on('data', function(doc) {
  // ...
});