Mongodb复合索引 - 也内置_id排序?

Posted

技术标签:

【中文标题】Mongodb复合索引 - 也内置_id排序?【英文标题】:Mongodb compound index - also built in _id sort? 【发布时间】:2018-03-09 23:37:47 【问题描述】:

我有一个复合索引

 userID:1, connectionStatus: 1, userTargetLastName: 1)

我想支持两个查询:

UserConnection.find(  $and : [  userID : req.decoded.id ,  connectionStatus : 'accepted'  ] )
                .sort('_id': -1).exec()

UserConnection.find(  $and : [  userID : req.decoded.id ,  connectionStatus : 'accepted'  ] )
                .sort('userTargetLastName': 1).exec()

我很困惑是否需要第二个复合索引来按 _id 排序,或者它是否“内置”到我的复合索引中? (根据 mongodb 文档,我的复合索引还应该支持 userID:1、connectionStatus:1 查询(但我可以按什么顺序对它们进行排序?按 _id ?)。所以我需要在 _id 或 created 上添加另一个复合索引?

  userID:1, connectionStatus: 1, created: -1)

【问题讨论】:

【参考方案1】:

您只查询userIDconnectionStatus,因此您的复合索引不需要包含userTargetLastName。排序是根据查询的结果完成的,在排序字段上建立索引并不重要,因此在索引中包含_id 并不重要。

检查索引使用的最佳方法是在查询中使用explain() 函数。这将告诉您很多关于正在使用的索引,以及它的效率(扫描的文档数量等)。

【讨论】:

谢谢,我应该说我想将查询限制在 10 个。对于具有特定 connectionStatus 的用户 ID,可以说有 200 个结果。我想要 10 按 userTargetLastName 或 _id(或创建)排序。 另外,感谢“explain()” - 我现在将使用它来检查事情是否按我的意愿工作 您还可以使用 explain("executionStats") 和 explain("allPlansExecution") 来优化您的查询。见docs.mongodb.com/manual/reference/method/cursor.explain

以上是关于Mongodb复合索引 - 也内置_id排序?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 复合索引到 Kibana elasticsearch

MongoDB索引,是不是可以同时创建普通和复合?

MongoDB复合索引详解

MongoDB - 唯一索引与复合索引

MongoDB索引问题

MongoDB 中的复合索引是不是改进了多重匹配(而不是排序)?