in mongodb, what is the most efficient way to get the first and last document(在MongoDB中,获取第一个和最后一个文档的最有效方式是什么)
问题描述
我有这样的文档:
class A
{
DateTime T;
...
}
我想查找最早和最新的文档。
这样做是否更好:
var First = db.Collection.AsQueryable().OrderBy(_ => _.t).FirstOrDefault();
var Last = db.Collection.AsQueryable().OrderByDescending(_ => _.t).FirstOrDefault();
或
var First = db.Collection.AsQueryable().OrderBy(_ => _.t).FirstOrDefault();
var Last = db.Collection.AsQueryable().OrderBy(_ => _.t).LastOrDefault();
或
var C = db.Collection.AsQueryable().OrderBy(_ => _.t);
var First = C.FirstOrDefault();
var Last = C.LastOrDefault();
我想知道基础实现中是否有什么东西会更改这些选项之间的速度?
我想知道排序是否已经进行了一次,是否有可能缓存结果,获取第一个和最后一个元素会更快?
当您对驱动程序语法不确定时,推荐答案
Profiler将成为您的朋友。要启用所有查询的日志记录,您需要在数据库上运行下面的语句:
db.setProfilingLevel(2)
然后检查您需要运行的数据库上执行的最后一个查询:
db.system.profile.find().limit(1).sort( { ts : -1 } ).pretty()
因此,对于第一个代码片段,您将获得:
"pipeline" : [ { "$sort" : { "t" : 1 } },
{ "$limit" : 1 }
]
"pipeline" : [ { "$sort" : { "t" : -1 } },
{ "$limit" : 1 }
]
打印第二对
"pipeline" : [ { "$sort" : { "t" : 1 } },
{ "$limit" : 1 }
]
并在我的机器上抛出LastOrDefault
NotSupportdException,如果它在您的MongoDB驱动程序版本上运行,您可以使用探查器检查生成的MongoDB语句
当您将鼠标悬停在Visual Studio中的c
上时,它会打印最后一个
{aggregate([{ "$sort" : { "t" : 1 } }])}
但是因为它的类型是IOrderedQueryable<T>
,所以它只是不是物化查询,所以当您运行FirstOrDefault
生成与前面语句相同的聚合体时,它将在数据库上执行。我在这里也收到了NotSupportdException。Here您可以找到受支持的LINQ运算符的列表,但Last
和LastOrDefault
都未实现,因此您需要按降序排序。
这篇关于在MongoDB中,获取第一个和最后一个文档的最有效方式是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在MongoDB中,获取第一个和最后一个文档的最有效


基础教程推荐
- Page.OnAppearing 中的 Xamarin.Forms Page.DisplayAlert 2022-01-01
- C# - 如何列出发布到 ASPX 页面的变量名称和值 2022-01-01
- 我什么时候应该使用 GC.SuppressFinalize()? 2022-01-01
- 创建属性设置器委托 2022-01-01
- 使用 SED 在 XML 标签之间提取值 2022-01-01
- C# - 将浮点数转换为整数...并根据余数更改整数 2022-01-01
- 当键值未知时反序列化 JSON 2022-01-01
- 如何使用OpenXML SDK将Excel转换为CSV? 2022-01-01
- 覆盖 Json.Net 中的默认原始类型处理 2022-01-01
- 从 VB6 迁移到 .NET/.NET Core 的最佳策略或工具 2022-01-01