Query Optimization with Index not being considered

Hi Team,

I have a query with filter, sort and limit.

"filter": {
      "activityType": {
        "$in": [
      "createdAt": {
        "$gt": {
          "$date": "2023-06-26T23:59:59.999Z"
      "_id": {
        "$lt": {
          "$oid": "649a696323094096e4d74015"
    "sort": {
      "createdAt": -1,
      "_id": -1
    "projection": {},
    "hint": "activityType_1_createdAt_1__id_1",
    "limit": 10,
    "collation": {
      "locale": "en_US"

From, the code I am even adding hint option for index to use.

However, I see huge number of docs/keys examined

"planSummary": "IXSCAN { activityType: 1, createdAt: 1, _id: 1 }",
  "keysExamined": 169245,
  "docsExamined": 169245,
  "hasSortStage": true,
  "cursorExhausted": true,
  "numYields": 169,
  "nreturned": 10,
  "queryHash": "9427BF19",
  "queryFramework": "classic",

However, when I run the same query via Compass - I can see less number of docs/keys

I deleted and reindexed this changes but to no avail.

It seems like you’re experiencing some performance issues with your MongoDB query despite adding an index hint. Let’s break down your query and see if we can optimize it further:

  1. Filter Criteria: Your query filters documents based on the activityType, createdAt, and _id fields. Make sure that these fields are indexed properly.
  2. Index Hint: You’ve provided an index hint for { activityType: 1, createdAt: 1, _id: 1 }. This should help MongoDB choose the correct index for your query.
  3. Sorting: You’re sorting the results by createdAt and _id, both in descending order. Sorting can be expensive, especially when dealing with large datasets.
  4. Limit: You’re limiting the results to 10 documents, which is good for performance.

Given that your query has examined a large number of keys and documents, here are a few suggestions:

  • Index Optimization: Double-check that your indexes are optimized for the query. Ensure that the fields you’re querying, filtering, and sorting on have appropriate indexes.
  • Review Sorting: Sorting on multiple fields can be costly. Consider if both createdAt and _id need to be sorted or if you can optimize the sorting logic.
  • Data Volume: If your collection has a very large number of documents, even with proper indexing, some queries may still require a significant amount of resources. In such cases, consider sharding or other scaling strategies.
  • Query Patterns: Analyze your query patterns and usage scenarios. Sometimes, restructuring data or adjusting queries can significantly improve performance.

If you continue to experience performance issues, you might want to consider reaching out to MongoDB’s support or community forums for more in-depth assistance tailored to your specific use case.


  "filter": {
    "activityType": {
      "$in": ["buy", "win_auction", "list", "create_auction"]
    "createdAt": {
      "$gt": { "$date": "2023-06-26T23:59:59.999Z" }
    "_id": { "$lt": { "$oid": "649a696323094096e4d74015" } }
  "sort": { "createdAt": -1 },
  "limit": 10,
  "collation": { "locale": "en_US" }

**Adjustments made:**

**Removed _id from Sort:** Since we're already querying based on _id in the filter criteria, we don't necessarily need to sort by it. Removing _id from the sorting stage may reduce the complexity of the query.

**Removed Index Hint:** In some cases, MongoDB's query optimizer may perform better without an index hint, especially if the provided hint isn't optimal for the query. Removing the hint allows MongoDB to choose the best index based on its statistics and query plan.

By simplifying the sorting stage and removing the index hint, we aim to improve the query’s performance. However, it’s essential to monitor the query’s execution after these changes to ensure they have the desired effect. If you still encounter performance issues, further optimization or analysis of the data and indexes may be necessary.

I am raising the Generative AI red flag on @Nelson_mari’s reply.

  • Nice Lists: The post presents very well formatted itemize list with embolden sub title. Just like I will do here.
  • Recommendations that ignores the OP: Despite the OP mentioning indexing the fields, the GAI recommends to Make sure the fields are indexed.
  • Contrary blabla: Providing hint helps MongoDB choose the appropriate index and MongoDB might perform better without an hint.
  • Ignoring the context: The GAI recommends in the community forum to consult the community form.
  • Ignoring the use-case: Sorting on multiple fields is expensive and limiting is good for performance. Well, when we sort on multiple fields and we limit it is because it is required by the use case.
  • No grammatical errors: Despite rereading my post multiple time before pressing the button, I always find errors when I reread what I wrote after someone reply.
  • No specific solution: Well there is one, but it breaks the use case. Not sorting on _id because _id is present in the query will break the use-case if many entries have the same createdAt value.