如何使用 MongoDB 中的自定义字段对分页进行索引和排序,例如:名称而不是 id

Posted

技术标签:

【中文标题】如何使用 MongoDB 中的自定义字段对分页进行索引和排序,例如:名称而不是 id【英文标题】:How to index and sorting with Pagination using custom field in MongoDB ex: name instead of id 【发布时间】:2019-01-01 07:24:01 【问题描述】:

https://scalegrid.io/blog/fast-paging-with-mongodb/

Example :  
    _id,
    name,
    company,
    state

我已经浏览了上面链接中解释的 2 个场景,它说在检索和排序结果时,按对象 id 排序可以获得良好的性能。我不想使用 object id 进行默认排序,而是想为我自己的自定义字段“name”和“company”建立索引,希望对这两个字段进行排序和分页(两个字段都保存字符串值)。

我不确定我们如何使用 gt 或 lt 作为名称,目前阻止了如何解决此问题以在用户按名称排序时提供分页。

如何对两个字段进行索引和分页?

【问题讨论】:

在 mogoDB 中使用所有小写的集合名称只是一个命名约定。使用“示例”而不是“示例”***.com/questions/9868323/… 【参考方案1】:

您的问题的答案是

db.Example.createIndex(  name: 1, company: 1  )

对于分页解释,您在问题上分享的链接已经足够好了。例

db.Example.find(name = "John", country = "Ireland"). limit(10);

用于排序

db.Example.find().sort("name" = 1, "country" = 1).limit(userPassedLowerLimit).skip(userPassedUpperLimit);

如果用户请求在按名称排序后获取 21-30 第一个文档,则按升序排列国家/地区

db.Example.find().sort("name" = 1, "country" = 1).limit(30).skip(20);

基本了解 MonogDB 中的索引

索引支持在 MongoDB 中高效执行查询。如果没有索引,MongoDB 必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB 可以使用该索引来限制它必须检查的文档数量。

索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。

默认 _id 索引

MongoDB 在创建集合期间在 _id 字段上创建唯一索引。 _id 索引可防止客户端插入两个具有相同 _id 字段值的文档。您不能在 _id 字段上删除此索引。

创建索引

在 Mongo Shell 上执行的语法

db.collection.createIndex( <key and index type specification>, <options> )

例如:

db.collection.createIndex(  name: -1  )

升序使用1,降序使用-1

上述富查询仅在不存在相同规格的索引时才创建索引。

索引类型

MongoDB 提供不同的索引类型来支持特定类型的数据和查询。但是我想提两个重要的类型

1.单场 除了 MongoDB 定义的 _id 索引外,MongoDB 还支持在文档的单个字段上创建用户定义的升序/降序索引。

2。复合指数 MongoDB还支持多个字段的自定义索引,即复合索引。

复合索引中列出的字段顺序很重要。例如,如果复合索引由 name: 1, company: 1 组成,则索引首先按名称排序,然后在每个名称值中按公司排序。

来源我的理解和回答以及更多关于MongoDB索引的知识MongoDB Indexing

【讨论】:

用户将请求具有用户定义的分页大小的所有行的问题。它不仅仅是搜索单个名称。如何根据名称列排序并对结果进行分页。我们不能将 gt 或 ls 用于名称字段。我们建议。 我的意思是我们不能为 name 字段选择方法 #2,尽管方法 #2 的性能非常好,并且混淆了我们如何在其他也类似于 id 字段的字段中实现它 @bhau hoysala ...根据上面的链接,如果我们对用户使用跳过和限制,它将影响性能。是对的吗?不,当列不是 id 列时,除了使用 skip 和 limit 之外,我们没有其他方法......链接说如果我们使用 skip 和 limit,这应该是一个严重的性能问题。请指教 @JavaDeveloper 我不认为任何其他方式都可以在不使用 limit() 和 skip() 使用富查询的情况下实现分页。当我们在用于查找、排序、限制和跳过功能的字段上添加索引时,它有助于在一定程度上提高性能。

以上是关于如何使用 MongoDB 中的自定义字段对分页进行索引和排序,例如:名称而不是 id的主要内容,如果未能解决你的问题,请参考以下文章

使用 MongoDB .Net 驱动程序对存储在文档字段中的数组进行分页

RxJS:使用 NestJS HttpService 对分页 API 进行并行 http 调用

在 Laravel 中对分页变量进行排序

通过模型关系列对分页器对象进行排序

Vue JS 对分页 Laravel 结果的实时客户端搜索过滤器

如何使用MongoDB聚合进行分页?