所以我想删除我的数据集,其中有20亿条记录。我在url上有一个索引,我想遍历每条记录,看看是否重复。
索引为110GB
MongoDB.Driver.MongoCommandException:'命令查找失败:执行程序查找命令中的错误::由::排序操作引起的错误更多而不是最大33554432字节的RAM。添加索引,或指定一个较小的限制..'
由于索引很大,我的当前方法无法运行。
var filter = Builders<Page>.Filter.Empty;
var sort = Builders<Page>.Sort.Ascending("url");
await collection.Find(filter).Sort(sort)
.ForEachAsync(async document =>
{
Console.WriteLine(document.Url);
//_ = await collection.DeleteOneAsync(a => a.Id == document.Id);
}
);
如果目标是删除具有相同url的重复页面,为什么不使用如下所示的聚合:
db.Page.aggregate(
[
{
$sort: {
url: 1
}
},
{
$group: {
_id: "$url",
doc: { $first: "$$ROOT" }
}
},
{
$replaceWith: "$doc"
},
{
$out: "UniquePages"
}
],
{
allowDiskUse: 1
})
它将创建一个名为UniquePages
的新集合。在检查了该集合以查看数据是否正确之后,您只需删除旧的Page
集合并将新的集合重命名为Page
。
请确保排序操作使用索引。这通常会更好地执行,并且内存排序h 作为最大32MB的限制。 Refer to doc.,然后检查文档uses indexes to sort query results。
使用query plan标识所选的/ winningPlan执行计划
使用executinStats分析查询性能详细信息