首页 > 解决方案 > 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);
    }
);

标签: c#mongodbmongodb-.net-driver

解决方案


如果目标是删除具有相同 url 的重复页面,为什么不使用如下聚合:

db.Page.aggregate(
    [
        {
            $sort: {
                url: 1
            }
        },
        {
            $group: {
                _id: "$url",
                doc: { $first: "$$ROOT" }
            }
        },
        {
            $replaceWith: "$doc"
        },
        {
            $out: "UniquePages"
        }
    ],
    {
        allowDiskUse: 1
    })

它将创建一个名为UniquePages. 检查该集合以查看数据是否正确后,您可以简单地删除旧Page集合并将新集合重命名为Page.


推荐阅读