Profiler https://docs.mongodb.com/manual/tutorial/manage-the-database-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 }
]
并抛出不支持异常 for LastOrDefault
在我的机器上,如果它适用于您的 MongoDB 驱动程序版本,您可以使用探查器检查生成的 MongoDB 语句
当您将鼠标悬停在c
在你的 Visual Studio 中它会打印
{aggregate([{ "$sort" : { "t" : 1 } }])}
但因为它是类型IOrderedQueryable<T>
它只是不是具体化查询,因此当您运行时它将在数据库上执行FirstOrDefault
生成与之前的语句相同的聚合体。我在这里也遇到了 NotSupportedException 。Here http://mongodb.github.io/mongo-csharp-driver/2.8/reference/driver/crud/linq/您可以找到受支持的 LINQ 运算符的列表以及Last
and LastOrDefault
没有实现,所以你需要降序排序。