MongoDb&C#:将游标与大索引一起使用

问题描述 投票:1回答:2

所以我想删除我的数据集,其中有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# mongodb mongodb-.net-driver
2个回答
1
投票

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

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

它将创建一个名为UniquePages的新集合。在检查了该集合以查看数据是否正确之后,您只需删除旧的Page集合并将新的集合重命名为Page


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.