1

我有一个大型(60m+)文档集合,每个 ID 在时间序列中都有许多记录。每条记录都有一个 IMEI 标识符,我希望为给定的List<Imei>.

蛮力方法是目前正在发生的事情,我为每个 IMEI 创建一个循环并yield从最上面的记录中取出,然后在循环完成后返回一个完整的集合。像这样:

        List<BsonDocument> documents = new List<BsonDocument>();

        foreach(var config in imeiConfigs)
        {
            var filter = GetImeiFilter(config.IMEI);
            var sort = GetImeiSort();
            var data = _historyCollection.Find(filter).Sort(sort).Limit(1).FirstOrDefault();

            documents.Add(data);
        }

最终结果是 a其中包含eachList<BsonDocument>的最新信息,但它的性能并不高。如果太大,则查询需要很长时间才能运行和返回,因为文档相当大。BsonDocumentIMEIimeiConfigs

有没有办法在单个查询中TOP 1为每个选择IMEI,而不是像我上面那样的蛮力?

4

2 回答 2

0

我认为糟糕的表现来自“排序(排序)”,因为排序迫使它遍历所有集合。

但也许您可以通过并行提高时间性能。

List<BsonDocument> documents;

documents =  imeiConfigs.AsParallel().Select((config) =>
{
    var filter = GetImeiFilter(config.IMEI);
    var sort = GetImeiSort();
    var data = _historyCollection.Find(filter).Sort(sort).Limit(1).FirstOrDefault();

    return data;
}).ToList();
于 2019-10-09T16:43:06.093 回答
0

尝试过使用 LINQ Take功能吗?

        列出文件 = new List();

foreach(var config in imeiConfigs) { var filter = GetImeiFilter(config.IMEI); var sort = GetImeiSort(); var data = _historyCollection.Find(filter).Sort(sort).Take(1).FirstOrDefault(); documents.Add(data); }

https://docs.microsoft.com/es-es/dotnet/api/system.linq.enumerable.take?view=netframework-4.8

于 2019-10-09T15:37:01.843 回答