【问题标题】:Bulk deleting documents from aggregate从聚合中批量删除文档
【发布时间】:2018-03-11 06:53:18
【问题描述】:

我正在尝试对 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 的参数中添加一个回调函数,但该函数永远不会被命中:

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

【问题讨论】:

  • 批量操作上线?哇!我认为你一定不要那样做。我建议您在服务器上使用每晚的批处理进程,该进程必须放在您的调度程序上。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

监听光标上的数据和结束事件:

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();
            }
        });
    }
});

【讨论】:

  • 我也会在一段时间后执行批量操作,因为它可能会因为内存不足而导致应用程序崩溃。假设在每 5000k 个命令之后。
【解决方案2】:

什么版本的猫鼬?有一个issue on github 可能是相关的。所以不妨试试:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多