c# - MongoDb & C#:在大索引上使用带有排序的游标
问题描述
所以我想对包含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
.
推荐阅读
- python - 尝试在 ATOM 1.30 中运行 Python 3.7 但收到 EOFError
- css - 通过 CSS 对 Bootstrap 活动导航栏项目的闪亮效果
- javascript - 将块动画滑动到另一个块,最后有弹跳
- ruby-on-rails - Facebook::Messenger::Subscriptions::Error(必须使用活动访问令牌来查询有关当前用户的信息。)
- java - 使用 fetch 时 CriteriaBuilder 查询中断,但没有
- database - OrientDB 图形数据库 - 基于连接边设置字段内容
- swift - 实例成员不能用于可编码 JSON 类型
- javascript - 如何在 angular6 中创建非 SPA 页面?
- c# - 为什么在 C# 中使用 AutoResetEvent 和 ManualResetEvent 时我的代码输出不同
- java - 如何在功能/单元测试中传递查询/路径参数?