[英]When using the Mongo C# driver, does query sorting occur within Mongo, or at the C# level?
假设您想使用 C# 驱动程序从 Mongo 数据库中检索具有时间戳字段的一堆文档,并且您希望它们按时间戳按降序 (-1) 排序。
创建索引时,对于以这种方式排序的查询,是否需要按 -1 顺序包含时间戳字段? 还是没有必要,因为只有从 Mongodb 中提取文档并转换为 C# 对象并因此按 .NET 对“内存”进行排序后,才会进行排序?
假设我的文档有以下字段:user_id、action_id 和 timestamp
我想要一个索引来帮助搜索用户的所有操作,并按降序排序。 我的索引应该只包含 user_id 和 action_id,还是应该也使用时间戳字段?
根据文档,Mongo 驱动程序包含针对 Mongo 聚合框架的 LINQ 实现。 这意味着像这样的查询
var query = from p in collection.AsQueryable()
orderby p.Name, p.Age descending
select p;
//or
var query = collection.AsQueryable()
.OrderBy(p => p.Name)
.ThenByDescending(p => p.Age);
将 map 放入以下聚合管道:
[
{ $sort: { Name: 1, Age: -1 } },
]
当然你不必使用LINQ,你也可以不用它写等价的查询。 但答案是肯定的,驱动程序确实支持将您的查询转换为在数据库端执行的内容。
文档中的此页面指的是我相信您所描述的确切情况:
db.records.createIndex( { a: 1 } )
将支持按顺序和逆序遍历:
db.records.find().sort( { a: 1 } )
db.records.find().sort( { a: -1 } )
这些文档有大量关于索引的信息,因此我建议您阅读它们以了解什么最适合您的用例。
MongoDB 能够在将数据发送回客户端之前对其进行排序。 当您在查询中提供sort
子句时,实际执行排序的是mongod
,而不是驱动程序或 .NET 运行时。
对于排序,可能会发生两件事,具体取决于可用的索引:
一个好的经验法则是,如果要对某个字段进行排序,为该查询创建的索引需要以该字段结尾。
因此,如果您只查询timestamp
字段,那么您只需要timestamp: -1
或timestamp: 1
的索引。 该索引可用于具有任一排序方向的查询。
如果您要查询多个字段,那么您希望索引以timestamp
结尾。 因此,对于您提供的示例,您可能需要一个像{ user_id: 1, action_id: 1, timestamp: -1 }
这样的索引,它可以支持该精确查询。
如果不存在可用于排序的索引,则会发生在 memory 中。 但是,内存中的排序存在限制,以防止服务降级。 在撰写本文时, 它是 32 MB 。 如果排序操作需要更多,则需要创建索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.