繁体   English   中英

使用 Mongo C# 驱动程序时,查询排序是在 Mongo 内发生还是在 C# 级别发生?

[英]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 运行时。

对于排序,可能会发生两件事,具体取决于可用的索引:

  1. 使用索引排序
  2. 无索引排序

一个好的经验法则是,如果要对某个字段进行排序,为该查询创建的索引需要以该字段结尾

因此,如果您查询timestamp字段,那么您只需要timestamp: -1timestamp: 1的索引。 该索引可用于具有任一排序方向的查询。

如果您要查询多个字段,那么您希望索引以timestamp结尾。 因此,对于您提供的示例,您可能需要一个像{ user_id: 1, action_id: 1, timestamp: -1 }这样的索引,它可以支持该精确查询。

如果不存在可用于排序的索引,则会发生在 memory 中。 但是,内存中的排序存在限制,以防止服务降级。 在撰写本文时, 它是 32 MB 如果排序操作需要更多,则需要创建索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM