如何使用 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 调用