C# 查找数组中每个ID的顶部(1)
我有一个庞大的(6000多万)文档集合,其中每个ID在时间序列中都有许多记录。每个记录都有一个IMEI标识符,我希望在给定的C# 查找数组中每个ID的顶部(1),c#,.net,mongodb,C#,.net,Mongodb,我有一个庞大的(6000多万)文档集合,其中每个ID在时间序列中都有许多记录。每个记录都有一个IMEI标识符,我希望在给定的列表中为每个IMEI选择最新的记录 蛮力方法是目前正在发生的事情,我为每个IMEI创建一个循环,并生成最上面的记录,然后在循环完成后返回一个完整的集合。因此: List<BsonDocument> documents = new List<BsonDocument>(); foreach(var config in
列表中为每个IMEI选择最新的记录
蛮力方法是目前正在发生的事情,我为每个IMEI创建一个循环,并生成最上面的记录,然后在循环完成后返回一个完整的集合。因此:
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);
}
列表文档=新列表();
foreach(imeiConfigs中的变量配置)
{
var filter=GetImeiFilter(config.IMEI);
var sort=GetImeiSort();
var data=_historyCollection.Find(filter).Sort(Sort).Limit(1).FirstOrDefault();
文件。添加(数据);
}
最终结果是一个列表
,其中包含每个IMEI
的最新BsonDocument
,但性能不高。如果imeiConfigs
太大,则查询需要很长时间才能运行和返回,因为文档相当大
有没有一种方法可以在单个查询中为每个IMEI
选择TOP 1
,而不是像我上面这样的暴力强制?尝试过使用LINQTake功能
是否尝试过使用LINQTake功能
我认为“Sort(Sort)”会带来糟糕的性能,因为排序迫使它遍历所有集合
但也许你可以通过并行技术来提高时间性能
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();
列出文档;
documents=imeiConfigs.AsParallel()。选择((配置)=>
{
var filter=GetImeiFilter(config.IMEI);
var sort=GetImeiSort();
var data=_historyCollection.Find(filter).Sort(Sort).Limit(1).FirstOrDefault();
返回数据;
}).ToList();
我认为“Sort(Sort)”会带来糟糕的性能,因为排序迫使它遍历所有集合
但也许你可以通过并行技术来提高时间性能
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();
列出文档;
documents=imeiConfigs.AsParallel()。选择((配置)=>
{
var filter=GetImeiFilter(config.IMEI);
var sort=GetImeiSort();
var data=_historyCollection.Find(filter).Sort(Sort).Limit(1).FirstOrDefault();
返回数据;
}).ToList();
这应该会有帮助:@rafalson接受限制(1)
是我上面已经做过的事情。我希望运行一个查询,在一个查询中为每个IMEI获取最顶层的文档,而不是在单个IMEI上循环并选择一个限制(1)
,然后将其添加到集合中。在GetImeiFilter()
和GetImeiSort()
中会发生什么?每个结果是什么?课程是如何设置的?我的方法是使用LINQ实现目标,并使用where和group子句来反对。如果解释了所有条件,并且可能提供了一些示例数据,sb。可以帮助您构建拟合查询。发布样本数据(来自mongo collection)会有所帮助。还要提到你创建的索引。这应该会有帮助:@Rafalsonn接受限制(1)
是我上面已经做过的。我希望运行一个查询,在一个查询中为每个IMEI获取最顶层的文档,而不是在单个IMEI上循环并选择一个限制(1)
,然后将其添加到集合中。在GetImeiFilter()
和GetImeiSort()
中会发生什么?每个结果是什么?课程是如何设置的?我的方法是使用LINQ实现目标,并使用where和group子句来反对。如果解释了所有条件,并且可能提供了一些示例数据,sb。可以帮助您构建拟合查询。发布样本数据(来自mongo collection)会有所帮助。还要提到您创建的索引。