从聚合中批量删除文档
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聚合的数据