如何在 1 个查询中从 Mongo 数据库中获取最小值和最大值? C#
How to get Min and Max values from Mongo DB in 1 query? C#
我可以在 2 个查询中获得最小值和最大值,
但是 C# 可以用 1 来实现吗?
var max = (await collection.Sort(descendingDateTime).Limit(1).FirstOrDefaultAsync())
.GetValue(timeField).ToUniversalTime();
var min = (await collection.Sort(ascendingDateTime).Limit(1).FirstOrDefaultAsync())
.GetValue(timeField).ToUniversalTime();
您可以使用如下所示的组聚合来实现,但对于非常大的集合来说效率不高,因为分组会导致集合扫描并耗尽内存(可能会达到 100mb 的分组限制)。最好使用 2 个查找查询来完成,因为它可以使用索引。作为一项改进,您可以 运行 通过使用 await Task.WhenAll(minTask, maxTask)
同时查询这两个查询
db.collection.aggregate(
[
{
$group: {
_id: null,
Min: { $min: "$TimeField" },
Max: { $max: "$TimeField" }
}
},
{
$project: {
_id: 0
}
}
])
afaik 也无法将上述聚合管道转换为强类型的 c# 查询,因为驱动程序不支持按空 ID 分组。
我可以在 2 个查询中获得最小值和最大值, 但是 C# 可以用 1 来实现吗?
var max = (await collection.Sort(descendingDateTime).Limit(1).FirstOrDefaultAsync())
.GetValue(timeField).ToUniversalTime();
var min = (await collection.Sort(ascendingDateTime).Limit(1).FirstOrDefaultAsync())
.GetValue(timeField).ToUniversalTime();
您可以使用如下所示的组聚合来实现,但对于非常大的集合来说效率不高,因为分组会导致集合扫描并耗尽内存(可能会达到 100mb 的分组限制)。最好使用 2 个查找查询来完成,因为它可以使用索引。作为一项改进,您可以 运行 通过使用 await Task.WhenAll(minTask, maxTask)
db.collection.aggregate(
[
{
$group: {
_id: null,
Min: { $min: "$TimeField" },
Max: { $max: "$TimeField" }
}
},
{
$project: {
_id: 0
}
}
])
afaik 也无法将上述聚合管道转换为强类型的 c# 查询,因为驱动程序不支持按空 ID 分组。