从聚合中批量删除文档

Posted

技术标签:

【中文标题】从聚合中批量删除文档【英文标题】: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();
);

【问题讨论】:

批量操作上线?哇!我认为你一定不要那样做。我建议您在服务器上使用每晚的批处理进程,该进程必须放在您的调度程序上。 【参考方案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) 
  // ...
);

【讨论】:

以上是关于从聚合中批量删除文档的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Elasticsearch7.6.2实现创建索引删除索引判断索引是否存在获取/添加/删除/更新索引别名单条/批量插入单条/批量更新删除数据递归统计ES聚合的数据

Acrobat DC 如何批量删除注释

高效批量删除 couchDB 中的文档

批量删除采用svn管理文档中的.svn文件

es批量删除文档json格式

SQL语句如何批量删除数据中回车、换行符?