MongoDB агрегатный счет с фасетом слишком медленный - PullRequest
0 голосов
/ 17 февраля 2019

Мой случай очень похож в этом ( Сводный счет MongoDB слишком медленный ), у меня 40 000 документов, и этот агрегат занимает 8 секунд, чтобы дать мне общее количество (40 000), показывающее только10 документов (лимит).

PS Если я запускаю customer.find (). Count (), он возвращает счет за 40 000 менее чем за 1 секунду

Это мой запрос:

aggregate([
{
  "$match": {}
},
{
  "$lookup": {
    "from": "core.entities",
    "localField": "entityId",
    "foreignField": "_id",
    "as": "entity"
  }
},
{
  "$unwind": "$entity"
},
{
  "$project": {
    "entity._id": 0
  }
},
{
  "$replaceRoot": {
    "newRoot": {
      "$mergeObjects": [
        "$entity",
        "$$ROOT"
      ]
    }
  }
},
{
  "$project": {
    "entity": 0
  }
},
{
  $facet: {
    paginatedResults: [
      {
        $skip: 0
      },
      {
        $limit: 10
      }
    ],
    totalCount: [
      {
        $count: 'count'
      }
    ]
  }
}])

Это мои индексы коллекции клиентов:

[{
  "v": 2,
  "key": {
    "_id": 1
  },
  "name": "_id_",
  "ns": "applekkus-gmp.core.customers"
},
{
  "v": 2,
  "key": {
    "name": 1
  },
  "name": "name_1",
  "ns": "applekkus-gmp.core.customers"
}]

... а это мой индекс коллекции сущностей:

[{
  "v" : 2,
  "key" : {
      "_id" : 1
  },
  "name" : "_id_",
  "ns" : "applekkus-gmp.core.entities"
}]

... а это мойсовокупное объяснение ():

"stages": [
{
  "$cursor": {
    "query": {
    },
    "queryPlanner": {
      "plannerVersion": 1,
      "namespace": "applekkus-gmp.core.customers",
      "indexFilterSet": false,
      "parsedQuery": {
      },
      "winningPlan": {
        "stage": "COLLSCAN",
        "direction": "forward"
      },
      "rejectedPlans": []
    }
  }
},
{
  "$lookup": {
    "from": "core.entities",
    "as": "entity",
    "localField": "entityId",
    "foreignField": "_id",
    "unwinding": {
      "preserveNullAndEmptyArrays": false
    }
  }
},
{
  "$project": {
    "entity": {
      "_id": false
    }
  }
},
{
  "$replaceRoot": {
    "newRoot": {
      "$mergeObjects": [
        "$entity",
        "$$ROOT"
      ]
    }
  }
},
{
  "$project": {
    "entity": false
  }
},
{
  "$facet": {
    "paginatedResults": [
      {
        "$limit": NumberLong(10)
      }
    ],
    "totalCount": [
      {
        "$group": {
          "_id": {
            "$const": null
          },
          "count": {
            "$sum": {
              "$const": 1
            }
          }
        }
      },
      {
        "$project": {
          "_id": false,
          "count": true
        }
      }
    ]
  }
}
],"ok": 1
...