Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找数组中每个ID的顶部(1)_C#_.net_Mongodb - Fatal编程技术网

C# 查找数组中每个ID的顶部(1)

C# 查找数组中每个ID的顶部(1),c#,.net,mongodb,C#,.net,Mongodb,我有一个庞大的(6000多万)文档集合,其中每个ID在时间序列中都有许多记录。每个记录都有一个IMEI标识符,我希望在给定的列表中为每个IMEI选择最新的记录 蛮力方法是目前正在发生的事情,我为每个IMEI创建一个循环,并生成最上面的记录,然后在循环完成后返回一个完整的集合。因此: List<BsonDocument> documents = new List<BsonDocument>(); foreach(var config in

我有一个庞大的(6000多万)文档集合,其中每个ID在时间序列中都有许多记录。每个记录都有一个IMEI标识符,我希望在给定的
列表中为每个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)会有所帮助。还要提到您创建的索引。